会引起 sql语句全表扫描的几种情况(可能不全,欢迎补充)(转载)
1.模糊查询(like)
like ‘ a%’ 这种查询是可以使用索引的
like'%a' 这种查询索引是会失效的
所以尽量避免不要使用2个百分号一起查询。建议的办法是reverse+function index 的形式。
2.查询中包含 is null的sql语句
3.查询中包含不等于这些符号的,例如( < > != )建议改成or来实现同样的判断或者查询功能
4.使用组合索引,如果查询条件中没有前导列
5.or使用不当也会造成全表扫描,不要过多的使用or.
原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。例如:where A=1 or B=2,A上有索引,B上没索引,则比较B=2时会重新开始全表扫描。
6.组合索引
排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。例如:create index skip1 on emp5(job,empno,date); select job,empno from emp5 where job=’manager’and empno=’10’ order by job,empno,date desc; 实际上只是查询出符合job=’manager’and empno=’10"条件的记录并按date降序排列,但是写成order by date desc性能较差。
7.update 修改 少量字段的时候尽量不要使用这个
8.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。
9.select count(*) from table;这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。
10.sql的where条件要绑定变量,比如where column=1,不要写成where column=‘aaa’,这样会导致每次执行时都会重新分析,浪费CPU和内存资源。
我的建议是 where column=$param
对于学优化的可以从这里抓起哦,好好学下,欢迎大家补充哦