1. 索引的定义
索引是将无序的数据变得有序,从而加快查找速率的一种数据结构。
2. 数据结构比较
2.1 Hash 表
- 特点:不支持顺序和范围查询,因此不适合某些场景。
- 优点:查找速度快,适合精确查找。
2.2 二叉树
- 特点:左子节点的值小于根节点,右子节点的值大于根节点。
- 缺点:在某些情况下(如插入顺序不当),可能形成斜树,严重影响查询速率。
2.3 AVL 树(自平衡二叉树)
- 特点:通过旋转操作保持平衡。
- 缺点:频繁的旋转可能影响 I/O 性能。
2.4 红黑树
- 特点:相对平衡,能够保证 O(log n) 的查找时间。
- 缺点:可能导致树的高度较高,增加多次磁盘 I/O 操作的可能性。
2.5 B 树与 B+ 树
- B 树:所有节点既存放键(key)也存放数据(data)。
- B+ 树:只有叶子节点存放键和数据,内节点只存放键。叶子节点之间有引用链。
- 优点:
- B+ 树的检索效率更稳定,查找过程从根节点到叶子节点。
- 范围查询时,B+ 树只需遍历链表,效率高于 B 树。
3. 聚集索引与非聚集索引
3.1 聚集索引(Clustered Index)
- 定义:索引结构与数据一起存放,InnoDB 中的主键索引即为聚集索引。
3.2 非聚集索引(Non-Clustered Index)
- 定义:索引结构与数据分开存放,二级索引(辅助索引)属于非聚集索引。
- 示例:MySQL 的 MyISAM 引擎使用非聚集索引。
3.3 回表
- 定义:通过索引快速定位数据后,再返回基础表获取完整行数据的过程。
4. 覆盖索引
- 定义:查找的数据都存在索引树的叶子节点上,避免回表操作,提升查询效率。
5. 主键非自增的问题
- 问题:插入效率下降,可能导致数据块移动。
6. 为什么使用 B+ 树作为默认索引结构
- 优势:
- B+ 树的叶子节点仅存储数据,其他节点存储键,存储效率更高。
- 叶子节点的双向链表结构提高了查询速度。
- B+ 树的 I/O 次数更少,索引效率更佳。
7. 索引失效的情况
- 模:模糊查询
LIKE
以%
开头。 - 型:数据类型错误。
- 数:对索引字段使用内部函数。
- 空:索引列是 NULL。
- 运:索引列进行四则运算。
- 最:复合索引不按最左索引列开始查找。
- 快:全表查找预计比索引更快。