B-tree 联合索引(多列索引)

可以使用索引的情况

  • 全值匹配
  • 匹配最左前缀(第一列)
  • 匹配列前缀(第一列开头部分)
  • 匹配范围值(只第一列)
  • 匹配某一列并范围匹配另一列(如精确第一列,范围第二列)
  • 只访问索引(覆盖索引,不访问数据行)

无法使用索引的情况:

  • 不从最左列索引开始查找
  • 跳过索引中的列
  • 某个查询使用范围查询,右边的列都无法使用索引(范围:like,大于,小于)

哈希索引

  • 所引致包含哈希值和行指针,无法避免读取行
  • 无法排序
  • 不支持部分索引列匹配查找,因为使用索引列全部内容计算哈希值
  • 只支持等值比较(, IN(), <=>),不支持范围查询
  • 当发生哈希冲突时,需要遍历行指针,逐行比较,所以在选择性很低的行上建哈希索引并不合适

高性能索引策略

  • 独立的列:索引列单独放在比较符号的一侧,不要有计算的表达式如 WHERE id + 1 = 5;
  • 前缀索引和索引选择性:
    很长的字符串可以只给前面一部分加索引,选取长度时应考虑选择性大小,可以先计算完整列的选择性,并使前缀的选择性尽可能接近(但也会有陷阱,如数据分布很不均匀,前缀选择性已经很接近,但某一部分值的选择性非常低,即你需要考虑最坏情况下的选择性)。唯一索引选择性是1,这是最好的选择性。MySQL无法使用前缀索引 ORDER BYGROUP BY。把用户电子邮箱字符串反转后存入,并加索引,可以查找某个域名的所有邮件地址。

  • 多个单独的列索引不能提高查询性能,最好的是正确顺序的多列索引。

  • 索引覆盖的查询可以在EXPLAINExtra列看到Using index,注意不要和type列混淆。

第五章的内容还是有很多,部分还没有完全理解,所以会继续更新