反例:SELECT*FROM student
正例:SELECT id,NAME FROM student
理由:
字段多时,表中数据过于庞大 select* 进行查询时,很可能不会用到索引,就会造成全表扫描,扫描了表中所有的数据,查取速度慢,浪费资源,查询具体字段节省资源、减少网络开销
2.尽量避免在where子句中使用 or 来连接条件
反例:select*from student where id =1or salary =3000;
正例: #分成两条语句分别执行select*from student where id =1;select*from student where salary =3000;
理由:
使用or可能会使索引失效,从而造成全表扫描,例如,如果id属性有索引,而salary属性没有索引,在查询时id属性用了索引查询,or后面的salary却只能用全表扫描,如果刚开始就用全表扫描,则省去了之前对id字段的索引查询。
explain#解释、观察SQL性能,explain主要看SQL是否使用了索引select*from dept where dname ='maomao';
7.in 和 not in 也分情况用,否则会导致全表扫描
反例:select id from dept where num in(1,2,3);
对于连续的数值,能用between就不用in
正例:select id from dept where num between1and3;
8.优化like语句
反例:
EXPLAINSELECT id,NAME FROM student WHERE NAME LIKE'%1';EXPLAINSELECT id,NAME FROM student WHERE NAME LIKE'%1%';
正例:
EXPLAINSELECT id,NAME FROM student WHERE NAME LIKE'1%'
理由:查询以1结尾或者含有1的记录会使索引失效,降低了查询效率;
反例:
EXPLAINSELECT*FROM student WHERE id+1-1=+1;
正例:
EXPLAINSELECT*FROM student WHERE id=+1-1+1;EXPLAINSELECT*FROM student WHERE id=1;
理由:
表达式会导致引擎放弃使用索引而进行全表扫描;
11.避免在where子句中使用!=或<>操作符
反例:
explainselect*from emp where salary <>30000;explainselect*from emp where salary !=30000;
理由:
表达式会导致引擎放弃使用索引而进行全表扫描;
12.where中使用默认值(0)代替null
#修改表,增加age字段,类型int,非空,默认值0ALTERTABLE student ADD age INTNOTNULLDEFAULT0;
13.提高 group by 语句的效率(先过滤,后分组)
反例:先分组,后过滤
select job,avg(salary) from employee
groupby job #先分组having job ='president'or job ='managent';#后过滤
正例:先过滤,后分组
select job,avg(salary) from employee
where job ='president'or job ='managent'#where语句过滤groupby job;#后分组
理由:
where 语句先过滤时,过滤字段一般会添加索引,根据索引快速的过滤掉一部分数据,进而分组时只剩需要的少量数据,提高了SQL的查询效率;