创建索引规律
- 字段的数值有唯一性的限制
- 频繁作为 WHERE 查询条件的字段,尤其在数据表大的情况下
- 需要经常 GROUP BY 和 ORDER BY 的列
- UPDATE、DELETE 的 WHERE 条件列,一般也需要创建索引
- DISTINCT 字段需要创建索引
- 做多表 JOIN 连接操作时,创建索引需要注意以下的原则:
- 连接表的数量尽量不要超过 3 张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
- 对 WHERE 条件创建索引,因为 WHERE 才是对数据条件的过滤。
- 对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。
什么时候不需要创建索引
- WHERE 条件(包括 GROUP BY、ORDER BY)里用不到的字段不需要创建索引
- 表记录太少,比如少于 1000 个,那么是不需要创建索引的。
- 字段中如果有大量重复数据,也不用创建索引
- 频繁更新的字段不一定要创建索引。因为更新数据的时候,也需要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。
什么情况下索引失效
- 如果索引进行了表达式计算,则会失效
- 如果对索引使用函数,也会造成失效
- 在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效。都要有索引,才会走索引。
- 当我们使用 LIKE 进行模糊查询的时候,前面不能是 %
- 索引列尽量设置为 NOT NULL 约束。判断索引列是否为 NOT NULL,往往需要走全表扫描
- 我们在使用联合索引的时候要注意最左原则
查看不常使用索引语句:
SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME,COUNT_STAR FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE INDEX_NAME IS NOT NULL
AND COUNT_STAR = 0
AND OBJECT_SCHEMA != 'mysql' AND OBJECT_SCHEMA != 'performance_schema'
此文章为4月Day19学习笔记,内容来源于极客时间《SQL必知必会》