SQL优化
查询计划
MySQL 查询计划
1 | EXPLAIN SELECT COUNT(*) FROM person |
基本
IN 包含的值不应过多
SELECT 语句返回字段务必指明字段名称
当只需要一条数据的时候,使用 limit 1
如果排序字段没有用到索引,就尽量少排序。或者为排序字段创建索引
or 两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用 union all 或者是 union (必要的时候) 的方式来代替 “or” 会得到更好的效果
尽量用 union all 代替 union
区分 in 和 exists、not in 和 not exists
IN 适合于外表大而内表小的情况;EXISTS 适合于外表小而内表大的情况
使用合理的分页方式以提高分页的效率
假设主键 ID 自增,且根据 ID 正排序。可以取上一个页最后一条的 ID 值
where id> 866612 limit 20
左右模糊查询应考虑使用全文索引,MySQL 支持
索引
避免在 where 子句中对字段进行 null 值判断,索引会失效
索引不会包含有 NULL 值的列
只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL 值,那么这一列对于此复合索引就是无效的,我们在数据库设计时不要让字段「可能会作为查询的字段」的默认值为 NULL
给排序字段创建索引,如果有多个排序字段,则创建复合索引。注意:排序方向必须一致,即都为正序或倒序
查询条件包含 or,可能导致索引失效
如果字段类型是字符串,where 时一定用引号括起来,否则索引失效
like 查询以 % 开头,会导致索引失效
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效
在索引列上使用 mysql 的内置函数,索引失效
对索引列运算(如,+、-、*、/),索引失效
索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效
不要给 ‘ 性别 ‘ 等增加索引。如果某个数据列里包含了均是 “0/1” 或 “Y/N” 等值,即包含着许多重复的值,就算为它建立了索引,索引效果不会太好,还可能导致全表扫描
创建索引
- where 条件
- order by 排序字段
- group by 分组字段
- left join xxx on 关联字段
索引字段数据差异越大,索引效果越好,比如唯一字段