适合创建索引的情况
- 具有唯一性要求的 字段
- 频繁作为WHERE条件的字段
- 经常GROUP BY 或 ORDER BY的列
- 注:GROUP BY先执行,因此建立联合索引时,把GROUP BY的列放到前面
- DISTINCT字段
- 多表JOIN 可以对用于连接的列创建索引
- 注意:连接的两个字段类型必须一致,否则会用函数隐式转换,造成索引失效
- 使用类型小的列创建索引
- 例如,
TINYINT
INT
占用不同字节,那么B+Tree节点中能放的记录数就不一样。
- 例如,
对字符串用 一定长度的前缀创建索引
add index on table1(comment(20))
SELECT COUNT(DISTINCT LEFT(name,length)))/COUNT(*) FROM TABLE1;
- 文本区分度 解读:计数name字段的left 前 length 长度DISTINCT的个数,除以总记录数,得到name字段的前length长度的文本区分度。
- 对字符串类型字段创建索引时必须指定索引前缀长度。
- 缺点:由于只是前缀,因此前缀索引不支持索引排序。
- 区分度高的列适合创建索引
- 如 文本区分度 中的计算公式,该值越接近1 区分度越高。
- 注:联合索引把区分度高的字段放在前面
当多个字段需要索引时,联合索引优于单值索引,且使用最频繁的字段放到联合索引的前面
- 联合索引提高索引使用率
- 让频繁使用的字段遵从最左前缀原则
覆盖索引
SELECT 二级索引中的字段 FROM 表名 WHERE 二级索引最左字段 = xxx;
此时用
EXPLAIN
会发现,EXTRA
为**using index**
,说明使用了覆盖索引- 即 :
WHERE
子句中的条件用到了索引(B+Tree),而SELECT
子句要查询的字段都包含在B+Tre中,这时不需要进行回表操作,我们称这种情况为覆盖索引。