适合创建索引的情况

  • 具有唯一性要求的 字段
  • 频繁作为WHERE条件的字段
  • 经常GROUP BYORDER BY的列
    • 注:GROUP BY先执行,因此建立联合索引时,把GROUP BY的列放到前面
  • DISTINCT字段
  • 多表JOIN 可以对用于连接的列创建索引
    • 注意连接的两个字段类型必须一致,否则会用函数隐式转换,造成索引失效
  • 使用类型小的列创建索引
    • 例如,TINYINT INT占用不同字节,那么B+Tree节点中能放的记录数就不一样。
  • 对字符串用 一定长度的前缀创建索引

    1. add index on table1(comment(20))
    1. SELECT COUNT(DISTINCT LEFT(name,length)))/COUNT(*) FROM TABLE1;
    • 文本区分度 解读:计数name字段的left 前 length 长度DISTINCT的个数,除以总记录数,得到name字段的前length长度的文本区分度。
    • 对字符串类型字段创建索引时必须指定索引前缀长度。
    • 缺点:由于只是前缀,因此前缀索引不支持索引排序。
  • 区分度高的列适合创建索引
    • 文本区分度 中的计算公式,该值越接近1 区分度越高。
    • 注:联合索引把区分度高的字段放在前面
  • 多个字段需要索引时,联合索引优于单值索引,且使用最频繁的字段放到联合索引的前面

    • 联合索引提高索引使用率
    • 让频繁使用的字段遵从最左前缀原则

      覆盖索引

      1. SELECT 二级索引中的字段 FROM 表名 WHERE 二级索引最左字段 = xxx;
  • 此时用EXPLAIN会发现,EXTRA**using index**,说明使用了覆盖索引

  • WHERE子句中的条件用到了索引(B+Tree),而SELECT子句要查询的字段都包含在B+Tre中,这时不需要进行回表操作,我们称这种情况为覆盖索引。