博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04 | 深入浅出索引(上)
阅读量:6818 次
发布时间:2019-06-26

本文共 1129 字,大约阅读时间需要 3 分钟。

索引就是为了提高数据查询的效率,就像书的目录一样。

索引的常见模型

  • 哈希表
    • 只适用于等值查询的场景,对于范围查询只能走全表扫描。
  • 有序数组
    • 等值查询和范围查询场景中的性能都非常好。
    • 插入性能太差。所以适合静态存储引擎,如2017年城市人口信息。
  • 二叉树
    • 查询复杂度是O(log(N))
    • 二叉树的搜索效率是很高的,但是大多数的数据库存储不会用二叉树。因为索引不止存在内存中,还要写到磁盘上。想象一棵100万节点的平衡二叉树,树高20,一次查询可能需要访问20个数据块。从磁盘随机读一个数据块就需要10ms左右的寻址时间,那么20个数据块的访问时间就会达到200ms。

InnoDB的索引

在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。

在InnoDB中,索引使用B+树的索引模式。B+ 树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数。

左边是主键索引,右边是普通索引。主键索引的叶子节点存的是整行数据,普通索引的叶子节点存的是主键的值。

  • 如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
  • 如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。

也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

索引维护

B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。以上面这个图为例,如果插入新的行 ID 值为 700,则只需要在 R5 的记录后面插入一个新记录。如果新插入的 ID 值为 400,就相对麻烦了,需要逻辑上挪动后面的数据,空出位置。

而更糟的情况是,如果 R5 所在的数据页已经满了,根据 B+ 树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去。这个过程称为页分裂。在这种情况下,性能自然会受影响。

所以使用自增主键的重要性就体现在这里了。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

  • 适合用业务字段直接做主键的场景
    1. 只有一个索引
    2. 该索引为唯一索引

总结

  • InnoDB使用B+树作为索引模型。因为B+ 树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数。
  • InnoDB是主键索引组织表
  • 推荐使用自增主键

转载于:https://juejin.im/post/5ca59ffae51d45592d484547

你可能感兴趣的文章
2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
查看>>
[代码]ural 1913 Titan Ruins: Old Generators Are Fine Too
查看>>
[转载]C++的顺序点(sequence point)和副作用(side effect)
查看>>
javascript 插入DOM节点
查看>>
【原】npm 常用命令详解
查看>>
Less学习
查看>>
一个在线的C++帮助文档网站 转载
查看>>
软件架构的5种视图
查看>>
jQuery相关知识总结
查看>>
瑞星:“007小游戏论坛”、“2144小游戏”等网站被挂马
查看>>
用情境搜索开启未来之路,互联网营销
查看>>
一起谈.NET技术,在ASP.NET中自动合并小图片并使用CSS Sprite显示出来
查看>>
VMwave Workstation 12 PRO 下安装黑苹果OS X 10.11.1教程
查看>>
eval & exec(绕过长度限制思路学习)
查看>>
python学习资料
查看>>
JQuery与js具体使用的区别(不全,初学)
查看>>
Hyper-V快速导入虚拟机的两个注意事项
查看>>
【转】getopt模块,实现获取命令行参数
查看>>
安装JDK和配置环境变量
查看>>
behavior planning——10 behaior planning pseudocode
查看>>