索引基础
索引的类型
独立的列
- 如果查询中的列不是独立的,则MySQL就不会使用索引,如下所示
SELECT name FROM user WHERE id + 1 = 5
- 前缀索引和索引的选择性
- 选择性是指不重复的索引值和数据表中的记录总数的比值,当选择值越高则查询效率越高。
- 如
aab
与abc
使用长度为2的aa
做索引比使用长度为1的a
做索引选择度要高 - 前缀索引是一种尽可能小、更快的有效办法,另一方面,MySQL无法使用前缀索引ORDER BY 或者 GROUP BY,也无法使用前缀索引做索引覆盖。
- 多列索引
- 当出现服务器对多个索引做相交操作时,通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引。
- 选择合适的索引列顺序
- 一般来说使用选择度较高的列放在最前面。
- 聚簇索引
- 当表有聚簇索引时,它的数据行实际上存放在索引的叶子叶上,术语"聚簇"标识数据行和相邻的键值紧凑的存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能由一个聚簇索引,
- 在InnoDB表中按主键顺序插入行
- 尽可能的使用单调递增的聚簇键来插入新值。
- 减少页分裂。
- 索引覆盖
- 根据索引直接获取值,而不需要再次读取行数据。
- 冗余和重复索引
- 当对数据进行插入、更新操作时,需要额外维护索引会导致速度变慢。
- 解决很简单,删除掉就好。