MySQL[1]-高性能索引
文章目录
索引基础
B-TREE
来源见水印
-
基于 B-TREE 的查询类型
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精准匹配某一列并范围匹配另外一列
- 只访问索引的查询
-
关于 B-TREE 的查询限制
- 不是按照最左列查询的,则无法使用索引
- 不能跳过索引中的列
- 如果某一列使用范围查询,则其右边的列无法使用索引优化查询
hash索引
- 关于 hash 索引的查询限制
- 索引数据不是顺序存储,所以不可排序
- 不支持部分索引列匹配
- 只支持等值比较查询
- hash 冲突时只能逐行扫描
- hash 冲突高时维护操作代价很大
高性能索引策略
独立的列
索引列不应该是表达式的一部分,也不能是函数的参数。
前缀索引和索引选择性
-
索引选择性
不重复的索引值和数据表的记录总数的比值(不重复的索引值/记录总数)比例越高索引效率越高。 -
前缀索引
解决大字段建立索引占用空间过大的问题。
ALERT TABLE table_name ADD KEY (field(length))
-
前缀索引无法 GROUP BY 和 ORDER BY
多列索引
and 条件 需要包含多个相关列的多列索引,而非多个独立的单列索引
选择合适的索引列顺序
聚簇索引
在 B-TREE 索引的叶子页上存储了数据行,因为数据行不能存储在多个地方所以一个表只能有一个聚簇索引。
为了保证少的存储碎片,聚簇索引应当选择自增类型的数据做索引值
覆盖索引
索引包含索要查询字段的值,则称之为覆盖索引,这种索引不需要会查数据行。
InnoDB 的二级索引在叶子节点存储的是行的主键值,所以,如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。
使用索引扫描排序
冗余和重复索引
多列索引和单列索引,如果多列索引可以通过前缀索引,则说明该单列索引是重复的。
尽量避免创建多余的索引,应当考虑拓展现有索引。
索引和锁
InnoDB实在读取行的时候加锁的,所以索引可以减少行的读取,从而减少了加锁操作。