1 避免全表扫描
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
商业化开发中,强制要求,不能全表扫描。尽量将查询type提升到ref级别之上,必须是index级别之上。
const > eq_ref > ref > range > index > ALL
MySQL EXPLAIN type类型说明
2 避免判断null值
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
1
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
1
3 避免不等值判断
应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
4 避免使用or逻辑
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
1
可以这样查询:
--union all 不会去除重复
--union 去除重复
select id from t where num=10
union all
select id from t where num=20
1
2
3
4
5
注意,运算的两个结果集,数据量最好不要超过千单位。
union - 并集排除重复
union all - 并集不排除重复
1
2
5 慎用in和not in逻辑
in 和 not in 也要慎用,否则会导致全表扫描,如:
查询t1表中num为t2中id大于10的人的id
select id from t1 where num in(select id from t2 where id > 10)
1
此时外层查询会全表扫描,不使用索引。可以修改为:
将子查询拆分成多表查询
select id from t1,(select id from t2 where id > 10)t2 where t1.num = t2.id
1
此时索引被使用,可以明显提升查询效率。
6 注意模糊查询
下面的查询也将导致全表扫描:
select id from t where name like ‘