您的位置:首页 > 数据库

初步认知数据库索引

2020-08-11 18:26 901 查看

索引:一种排好序的帮助快速查找的数据结构。索引的实现通常使用 B 树及其变种 B + 树

优势:

  • 提高数据检索速度,降低数据库的IO成本
  • 降低数据排序的成本,降低CPU消耗

缺点:额外的存储空间,降低了表更新的时间

索引的分类

单值索引、唯一索引、复合索引

索引的原理

索引的底层结构通常为:B树、B+树和hash结构

B树

  • 根节点至少有 2个孩子,至多有m个孩子
  • 除了根节点以外,所有内部节点至少有m/ 2(向上取整)个孩子,至多有m个孩子
  • 节点内部关键字=孩子数-1,并且内部关键字是有序的。
  • 所有外部节点位于同一层上。

B+树

  • 非叶子节点不存储data,只存储索引,
  • 叶子节点包含所有索引字段
  • 依次递增
  • 很好的支持范围查找,因为叶子节点用指针连接,且按序。

为什么B+树,非叶子节点不存储data?

答:不存储数据时,这样分配给存储索引字段空间增大,横向索引增大,这样子节点也增大,最后能存储的data也增大。

B+树的优势

B + 树比 B 树更适合实际应用中操作系统的文件索引和数据库索引

  • B + 的磁盘读写代价更低

B + 的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对 B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。数据存放的更加紧密,具有更好的空间局部性。一次性读入内存中的需要查找的关键字也就越多。因此访问叶子节点上关联的数据也具有更好的缓存命中率。相对来说 IO 读写次数也就降低了。

  • B+tree 的查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

  • 便于区间查找

B + 树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而 B 树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有 B + 树好。

MyISAM存储引擎实现(非聚集)

  • 底层数据文件有三个:.frm(表结构文件) .MYD(数据文件) .MYI(索引文件)
  • MylSAM索引文件和数据文件是分离的,索引文件只是存储数据的磁盘地址,通过地址读取数据文件获得数据

InnoDB存储引擎实现(聚集)

  • 表数据文件本身就是按照B+Tree组织的一个索引结构
  • 底层文件有两个:.frm(表结构文件) .ibd(索引和数据文件)
  • 叶子节点就包含了所有的数据

Hash实现索引结构

将某一元素作为索引,计算该元素的hash值。同时将该元素对于的数据行在磁盘的地址作为value存入。

但是

Hash 索引和 B + 树索引的特点:

  • Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位;

  • B + 树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的 IO 访问;

    因为 Hash碰撞(不同值具有相同hash值)的原因,比起B+树,Hash索引有如下局限性:

  • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;

  • 如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;

  • 同理,哈希索引没办法利用索引完成排序,以及 like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

  • 哈希索引也不支持多列联合索引的最左匹配规则;Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用;

  • Hash 索引在任何时候都不能避免表扫描,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要回表查询数据;

总结:Hash索引无法范围查询,无法模糊查询,无法排序操作,不支持联合索引最左匹配,无法避免表扫描。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: