MySQL SQL优化

全表扫描优化

避免/去除全表扫描

2. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT id FROM t WHERE col LIKE ‘Mich%’;”这个查询将使用索引,但“SELECT id FROM t WHERE col LIKE ‘%ike’;”这个查询不会使用索引。

3. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

select id from t where num=10 or num=20;
--使用union all替代or
select id from t where num=10 union all select id from t where num=20;

4. in 和 not in 也要慎用,否则会导致全表扫描,或者用 exists 代替 in

select id from t where num in(1,2,3);
-- 可用between代替
select id from t where num between 1 and 3;

select num from a where num in(select num from b);
-- 可用exists替代
select num from a where exists(select 1 from b where num=a.num)

5. 通配符使用

select id from t where name like '%abc%' 
--上面使用全表扫描,通配符不应出现在单词开头,用下面语句替代
select id from t where name like 'abc%'

6. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

select id from t where num/2=100;
--可改为
select id from t where num=100*2;

7. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描

select id from t where substring(name,1,3)='abc';
select id from t where name like 'abc%';

limit优化

IS NULL优化

select id from t where num is null;

--在num上设置默认值0,确保表中num列没有null值
select id from t where num=0;

8.2.1.13 IS NULL Optimization

order by优化

group by优化

MySQL查询优化:GROUP BY

distinct优化