最近和一些大牛在一些聊天时(资深技术专家),想到有必要写这个系列和大家分享点自己的感悟和想法。技术分为快餐技术和慢技术,快餐技术就是大家一看就懂的技术,而且马上就可以使用,看到效果,一般大家都比较喜欢学这个,它的好处是市场需要、快速上手、容易看到结果,不足之处是门槛低,大家都容易掌握,要想提升竞争力比较难;另一种是慢技术,它是需要你花上几个月,甚至一年的时间去消化,它代表了底层的技术,很长时间不会变,学习好它,不仅懂得用,而且知道内部的原理。所以就想到写这个序列,分享自己的一点感想,今天聊的是IO和磁盘中的数据查找,索引话题。

1、计算机处理速度的不相等性

相信这个观点,对于学过计算机的人来讲,并不陌生,很明显计算机处理速度的变慢序列是:cache > 内存 > 磁盘,它们不是在一个层级上。为了提升速度,就引入了缓存(cache),cache是一种高速缓存技术,所以整个计算机体系结构中的一些设计思想,是值得我们去认真学习的,现在很多的技术思想基本上可以在计算机体系结构中找到相似的设计思想,缓存就是其中的一个。为了加快速数据处理速度,尽量把数据放在内存中,避免频繁的读写磁盘。

结论:

内存的处理速度明显快于磁盘

尽量把数据放在内存中,减少磁盘的读写

2、内存和磁盘中查找数据的过程

2.1、内存查找数据

回想一下查找数据的方法有哪些呢?

顺序扫描:从头到尾扫描一个数组,缺点是时间复杂度比较高,是O(N)

二分查找:二分查找的思想是针对一个有序的数组,每次可以折半查找,这样查找一个数据可以节省一半的时间复杂度;

排序树:二分查找是一种折半的查找,很容易看到不断的折半就形成了一棵树,后面就人研究树型结构对于查询的作用,随着研究的深入,发现排序树有时会偏向一方,就发明了平衡排序树,平衡排序树有严格的要求,左右子树的高度不能过1,每次插入的过程中可能会产生旋转,这也是消耗性能的,又发明了红黑树,红黑树是在排序树和平衡排序树中找到一个平衡点,两边的高度差没有平衡排序树那么严格(旋转减少);

Hash法,通过散列的方法来查找,它的时间复杂度是O(1)

结论:

可以看出在内存中,最快的查找是Hash法,通过key就可以查找出value

需求是推动技术不断向前发展(应用场景),如上面的排序树 -> 平衡排序树 -> 红黑树 .....

2.2、 磁盘查找数据

读磁盘数据时,它要经历三个阶段:寻道、磁盘旋转、读写传输,整个最消耗时间的地方是寻道、磁盘旋转,它占整个读写全部时间的90%以上,所以要提升数据,就要减少IO交互,如想到的一些方法如预读,每次读的时间就读一个磁盘块的数据,根据数据相关性,很可能下次要读的数据(不是刚才查的数据,与刚才查找的数据在同一个数据块里),在写数据时,尽量要做到顺序写,不要随机写。

结论:

磁盘读写最花时间的地方是寻道和磁盘旋转,所以要尽量减少IO交互

尽量做到顺序写,不要随机写

3、数据库索引的那些事

问题:为什么数据库的索引要使用B+树呢?

索引可以看作是一个元数据,是数据的数据,目的是为了提升查找数据的速度,如目录一样。那为什么要使用B+树作为索引的数据结构呢,上面不是说hash才是最快的吗?

到这里,要清楚一个问题,索引数据不仅要能快速查找,而且要便于持久化存储,所以基于这个考虑,hash是适合内存查找,不适合磁盘。上面提到,磁盘查找数据的代价是很大的,如果伤痛在所难免,就要减少伤痛,所以减少磁盘IO的次数是关键,如何应对千万级别数据量的查找,不管是数百条记录,还是亿级记录,查找花的时间相近,这就对数据结构有相当大的要求了。B+树的高度就是IO的交互次数,一般B+树是m路树,这个m值很大,在100以上,所以根据计算,百万级别的数据量的查找,其实使用3次IO查寻就行了,其中根节点是常驻内存的,所以只需要2次IO查寻就ok了,这种查找方法是不是很快呢。

结论:

B+树适用于磁盘存储,应对百万级别数据查询,只需要2次IO查询就行了

4、总结

索引在平时工作中,经常遇到,知道它底层的原理思想,有利于知道根据原因,从学习中总结方法论,找到主要矛盾,解决问题。

计算机原理与技术索引的应用,经常学一点计算机底层原理系列之索引相关推荐

  1. 越来越多的岗位需要DPDK,那从DPDK该如何提升网络底层效率丨网络原理丨Linux服务器开发丨后端开发丨网络底层原理

    越来越多的岗位需要dpdk,那从dpdk该如何提升网络底层效率 1. dpdk线程模型 2. kni与数据接收处理流程 3. 手把手代码实现 视频讲解如下,点击观看: 越来越多的岗位需要DPDK,那从 ...

  2. 包头钢铁职业技术学院题库计算机,包头钢铁职业技术学院单独招生题库(计算机).DOC...

    包头钢铁职业技术学院单独招生题库(计算机).DOC 包头钢铁职业技术学院单独招生题库(计算机) 一.填空题50道 病毒的五个主要特征:(生性.传染性.潜伏性.爆发性.破坏性). 网页文件的扩展名:(H ...

  3. 2020中国高校计算机大赛网络技术挑战赛,风起云涌!2020 “中国高校计算机大赛-网络技术挑战赛”总决赛即将在浙南科技城开赛...

    10月23-25日,2020年"中国高校计算机大赛-网络技术挑战赛"总决赛将在温州浙南科技城拉开帷幕.届时,作为中国最具创新创业基因的热土之一--温州,将汇聚来自中国科学技术大学. ...

  4. 计算机测控技术在线作业二答案,华东《计算机测控技术》2020年春季学期在线作业(二)答卷【标准答案】...

    <计算机测控技术>2020年春季学期在线作业(二) 试卷总分:100 得分:100 一.单选题 (共 10 道试题,共 50 分) 1.计算机采取( )方式来决定何时由ADC0809读入数 ...

  5. python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)

    字典:(拓展–重要)字典核心底层原理 字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket. 每个bucket 有两部分:一个是键对象的引用,一个是值对 ...

  6. synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

    并发编程已经成为程序员必备技能 作为Java程序员,不懂得并发编程显然已经不能满足市场需求了,尤其是在面试过程中将处于被动地位,也有可能面试将就此终结. 那么作为Java开发者的你,日常虽然可以基于J ...

  7. 计算机原理中断电丢失,小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?...

    什么是闪存: 快闪存储器(英语:flash memory),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器 存储原理 要讲解闪存的存储原理,还是要从EPROM和EEPROM ...

  8. 计算机辅助设计的技术论文,【计算机病毒论文】谈计算机辅助设计课程微课化教学(共3741字)...

    摘要:高等教育正在实施教育信息化2.0行动,借助信息技术推动传统教学改革.微课教学作为新兴的教学手段,与高校设计类专业计算机辅助设计课程教学有着较好的契合点.通过对微课概念的解读,分析该课程微课化教学 ...

  9. java web底层原理_详解Java开发Web应用程序的底层原理

    前言 前面一篇文章,我从整个应用程序的整体以及跟运行环境的关系简单聊了一下我们现在常用的Spring框架的设计基础和准则,其中主要是控制反转和依赖注入,以及容器化编程等概念. 这里我不想去复述这些概念 ...

最新文章

  1. 解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
  2. hashmap(1.8)
  3. hamcrest详细介绍
  4. c++ 11 override final
  5. 利用numpy删除DataFrame某一行/列、多行内容
  6. Java Web实训项目:西蒙购物网(中)
  7. mac连接ubuntu,tomcat乱码
  8. 两个pv挂一个vg_今日德杯:VG、TES零封对手会师四强;FOFO状态爆表台湾网友热议:Maple比Fofo混得差;管泽元:牛宝快跑...
  9. 计算机硕士工资一览表,2021年计算机硕士工资一览表.doc
  10. 黑莓7290 使用说明
  11. C# CAD开发 选择集的使用
  12. sql问题导致CPU使用率100%
  13. 苹果蓝牙耳机使用说明_苹果蓝牙耳机怎么用
  14. python爬虫和医学数据_【爬虫】(八)Python之爬虫和数据小解析
  15. 计算机专业期末背书,每到期末,我就后悔读了这个专业
  16. 一起摇摆html5游戏,和 transformjs 一起摇摆
  17. 欣弗(克林霉素磷酸酯葡萄糖注射液)----恐怖的抗生素
  18. 项目上线后中英文翻译问题解决
  19. 特斯拉与宁波旭升 EDI项目案例
  20. 数据结构与算法A实验六图论---7-5 任务调度的合理性(拓扑排序)

热门文章

  1. 实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知...
  2. js基础之函数递传参数与作用域(5下)
  3. 博客园的祥和需要大家共同努力
  4. Oracle Golden Gate 系列十二 -- GG 数据初始化装载二 基于SCN 的初始化 说明 与 示例...
  5. Properties类 解析xml文件问题
  6. 演示FilterConfig接口的getInitParameter(String name)方法
  7. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用
  8. php返回成功信息msg_使用PHP实现的服务端socket
  9. 利用函数wavread对语音信号进行采样_统计与自适应信号处理知识点总结-期末考试...
  10. QT接收Linux内核,QT界面程序经过网路与普通的linux应用程序进行数据传送的情况...