MySQL Reading Notes
B-tree 联合索引(多列索引)
可以使用索引的情况
- 全值匹配
- 匹配最左前缀(第一列)
- 匹配列前缀(第一列开头部分)
- 匹配范围值(只第一列)
- 匹配某一列并范围匹配另一列(如精确第一列,范围第二列)
- 只访问索引(覆盖索引,不访问数据行)
无法使用索引的情况:
- 不从最左列索引开始查找
- 跳过索引中的列
- 某个查询使用范围查询,右边的列都无法使用索引(范围:like,大于,小于)
哈希索引
- 所引致包含哈希值和行指针,无法避免读取行
- 无法排序
- 不支持部分索引列匹配查找,因为使用索引列全部内容计算哈希值
- 只支持等值比较(
=
,IN()
,<=>
),不支持范围查询 - 当发生哈希冲突时,需要遍历行指针,逐行比较,所以在选择性很低的行上建哈希索引并不合适
高性能索引策略
- 独立的列:索引列单独放在比较符号的一侧,不要有计算的表达式如
WHERE id + 1 = 5;
-
前缀索引和索引选择性:
很长的字符串可以只给前面一部分加索引,选取长度时应考虑选择性大小,可以先计算完整列的选择性,并使前缀的选择性尽可能接近(但也会有陷阱,如数据分布很不均匀,前缀选择性已经很接近,但某一部分值的选择性非常低,即你需要考虑最坏情况下的选择性)。唯一索引选择性是1,这是最好的选择性。MySQL无法使用前缀索引ORDER BY
或GROUP BY
。把用户电子邮箱字符串反转后存入,并加索引,可以查找某个域名的所有邮件地址。 -
多个单独的列索引不能提高查询性能,最好的是正确顺序的多列索引。
- 索引覆盖的查询可以在
EXPLAIN
的Extra
列看到Using index
,注意不要和type
列混淆。
第五章的内容还是有很多,部分还没有完全理解,所以会继续更新