首页 > 其他 > 详细

关于索引

时间:2020-03-03 21:47:36      阅读:77      评论:0      收藏:0      [点我收藏+]

MySQL 数据库存储数据最终是以文件的形式存储到硬盘的,在程序中使用要把磁盘文件中的数据读到内存中
执行一次IO的时间可以执行40万条指令(如果以 CPU 的指令执行效率来比较的话) 数据库量十万百万千万级数据,如每次io 9毫秒的时间显然是个灾难
所以查找数据时把磁盘IO次数控制在一个很小的数量级,一个高度可控的多路搜索树就是 B + 树
树的高度决定着io的次数,如果没有索引 没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受 ,每个磁盘块都要发生一次IO(单个磁盘块中不可能存储太多数据) 效率会特别差

一、底层实现原理和优化
      在数据结构中,最常见的搜索结构就是二叉搜索树和AVL树(高度平衡的二叉搜索树,,当数据量比较大时,都会由于树的深度过大而造成I/O读写过于频繁,进而导致查询效率低下
      mysql的索引数据结构采取的是B+树
      B+树索引并不能根据键值找到具体的行数据,B+树索引只能找到行数据锁在的页,然后通过把页读到内存,再在内存中查找到行数据
      B+树,它的树高是恒定(可以控制在3到5层),它的渐进复杂度是恒定的
     索引若采用哈希:
         可以通过hash值定位具体的位置,效率高,但是不能进行模糊查询 范围查询
     一个索引的是否优秀判断的依据是 IO渐进复杂度
     索引若采用二叉树:
         若是一个斜二叉树,查询速度和全表扫描没有区别,树高
     索引若采用平衡二叉树:
         太深了:深度决定者io的次数,而io耗时大
         太小了:结点存储的信息太小了,从而导致频繁的io操作
     索引若采用红黑树:
          比二叉树相对来说会好一些。它会有一个因子会控制树高,无论二叉搜索树还是AVL树,当数据量比较大时,都会由于树的深度过大而造成I/O读写过于频繁
     索引若采用多路平衡二叉树:(B-Tree B树):
        (1)每个节点中有key,也有data,而每一个页的存储空间是有限的,如果data数据较大时就会导致每个节点(即一个页)能存储的key的数量很小
        (2)当存储的数据量很大时,同样1会导致B-Tree的深度较大,增加查询时的磁盘I/O次数,进而影响查询效率
     B+Tree叶子结点是顺序的,相邻结点存在顺序引用
         1:B+Tree拥有B-Tree的优点,深度浅,数据块大
         2:因为只在叶子结点存储数据,从而导致扫全表的能力强,因为叶子结点是顺序的,从而导致排序功能更强

二、B+树更适合B树
      磁盘读写代价更低:
          B+tree的内部结点相对B 树更小,相对来说IO读写次数也就降低了
      查询效率更加稳定:
          任何关键字的查找必须走一条从根结点到叶子结点的路,所有关键字查询的路径长度相同,导致每一个数据的查询效率相当
      主要原因:
          B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低

三、

 

关于索引

原文:https://www.cnblogs.com/webster1/p/12404805.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!