「高性能MySQL」创建高性能的索引
索引(在 MySQL 中也叫做 “键 (key)”)是存储引擎用于快速找到记录的一种数据结构。
# 索引的类型
扩展:官方文档 Index Types Per Storage Engine (存储引擎的索引类型) (opens new window)
点击查看
Storage Engine | Permissible Index Types |
---|---|
InnoDB (opens new window) | BTREE |
MyISAM (opens new window) | BTREE |
MEMORY (opens new window)/ HEAP | HASH , BTREE |
NDB (opens new window) | HASH , BTREE (see note in text) |
# B-Tree 索引
存储引擎以不同的方式使用 B-Tree 索引:
MyISAM | InnoDB |
---|---|
使用前缀压缩技术,使索引更小 | 按照原数据格式进行存储 |
通过数据的物理位置引用被索引的行 | 根据主键引用被索引的行 |
# 搜索方式
- 从索引的根节点开始进行搜索。
- 根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。
- 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。
- 最终存储引擎要么是找到对应的值,要么该值不存在。
- 叶子节点指针指向的是被索引的数据。
# 查询类型
全键值、键值范围、键前缀
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精准匹配某一列并范围匹配另一列
- 只访问索引的查询(覆盖索引)
# 限制
- 如果不是按照索引最左列开始查找,则无法使用索引
- 不能跳过索引的列
- 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询
# 哈希索引
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。
在 MySQL 中,只有 Memory 引擎显式支持哈希索引,也是 Memory 引擎默认索引类型。
# 查询类型
- 全值匹配
# 限制
- 不能覆盖索引
- 不能用于排序
- 只能等值比较查找,哈希表的特性所决定的
- 哈希冲突很多的话,操作代价高,常见于在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么删除表中的一行时,需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用。
上次更新: 2024/03/11, 22:37:05