MySQL索引(innodb)
- 数据结构
多路搜索平衡树,是平衡树的一种,所有叶子节点都必须在同一层。 并且叶子节点之间通过双向链表结构连接。(用于优化范围查询) - 作用
加速查询
- 创建过程
列值排序 -> 创建树结构
- 存储规则
- 所有非叶子节点存储索引值和指向下层节点的指针,索引值与指针间隔穿插存储。 - 对于聚簇索引(主键索引),叶子节点直接存储行数据;对于二级索引(非主键索引),叶子节点存储索引值和主键值。 - 查询过程
从根节点开始,通过二分查找,找到指向下层节点的指针,进入下层节点。 按照同样的规则,逐层下移,直到叶子节点。 如果是聚簇索引,可以直接在叶子节点获取行数据,如果是二级索引,先获得主键值,再回表通过主键索引找到行数据。 - 索引再平衡
- 介绍 - 由于索引的数据结构需是有序的严格的平衡树,所以随着数据的更新(增删改),需要不停地对树的节点做分裂或合并,以保证树的平衡性和节点的顺序性。 - 影响 - 因为innodb存储索引和数据的单位都是"页"(默认16kb)。 - 所以在节点分裂和合并过程中,会开新页并迁移数据(页分裂)或合并页并迁移数据(页合并),会导致并不是所有页都能正好存满数据,尤其是聚簇索引的叶子节点还存放了行数据,影响会更大。 - 随着树的节点变动,存储的碎片化可能会越来越高,即存不满数据的页越来越多。
- 索引重建
- 介绍 - 索引再平衡导致存储碎片化到达一定程度,mysql会自动触发索引重建。 - 会重新开页并创建新的索引树,并将数据按顺序迁移到新树。 - 影响 - 消除碎片化 - 数据库需要消耗大量性能完成重建工作。并且出于安全考虑,会锁表或者加其他锁保证数据安全,导致数据库出现响应慢或卡死一段时间的情况。
浙公网安备 33010602011771号