常见的SQL优化策略
1、避免全表扫描
对查询进行优化,应尽量避免全表扫描。首先考虑在where以及order by 上添加索引。
2、避免判断null值
避免在where子句中判断null值,否则会导致引擎放弃使用索引而进行全表扫描。
3、避免不等值判断
应尽量避免在where子句中使用 !=或者<>操作符,否则会导致引擎放弃使用索引而进行全表扫描。
4、避免使用or
应当尽量避免在where子句中使用or来连接条件,否则会导致引擎放弃使用索引而进行全表扫描。
例如:select id,name from user where age=10 or age=20
这样就会进行全表扫描。
改成:select id,name from user where age=10 union all select id,name from user where age=20
5、慎用 in 和 not in
也会导致全表扫描。可以改成表连接查询。
6、模糊查询要注意用法
因为mysql的索引可以匹配列的前缀。所以模糊查询的 like 最好由 like '%abc%'
=> like 'abc%'
。
7、避免在查询条件中做字段计算
还是会导致全表扫描。
例如:
select id from user where age/2=10
应改为:select id from user where age = 10*2
8、避免查询条件中对字段进行函数操作
也会导致全表扫描。
9、不要在where 子句 = 号左边做函数、算术或者其他运算
会导致引擎无法正确使用索引。
10、组合索引使用要用到第一个索引查询
因为mysql的索引有着匹配最左前缀的查询
(B-Tree索引)的规则。就好像打比方要找一个人。知道姓,一下子就能筛选很多,知道姓也知道名,找的就更快。但如果只知道名字,mysql索引就和我们一样不知道怎么找了。
所以,联合索引的查询必须用到第一个字段。至少。
11、用exists 代替 in
例如:select num from a where num in (select num from b)
可以改成
select num from a where exists(select 1 from b where num = a.num)