MySql索引查询细节处理
大家都知道,对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;查询的时候偶避免使用*,即使要查出全部内容,建议将所有字段写出。
在使用索引时也要注意一些细节处理,比如出现以下情况mysql会放弃使用索引:
1、 where子句中对字段进行 null 值判断。
不能用null作索引,任何包含null值都不会包含在索引中,即使有多列索引,只要有一列中含有null,该列就会从索引中排除。任何在where子句中使用is null或isnot null的语句将放弃使用索引。
2、 where子句中使用or 来连接条件。
例:select idfrom emp where num=10 or num=20
优化方式:select idfrom emp where num=10 union all select id from emp where num=20
3、 where子句中使用!=或<>操作符。
!=和<>操作都不会使用索引而将进行全盘扫描
例:select id from emp where id!=6;
优化方式:select id from emp where id>6 union all select id from emp where id<6;
4、 in 和 not in 慎用。
例:select idfrom emp where num in(1,2,3,4)
对于连续的数值,能用 between就不要用 in 。
优化方式:select idfrom emp where num between 1 and 4
5、使用like时如果是两个%%,将进行全盘扫描
例:select idfrom t where name like ‘%郑%’;
可优化方式:selectid from t where name like ‘郑%’;
6、where 子句中使用参数,也会导致全表扫描。(因为SQL只有在运行时才会解析局部变量。)
例: select idfrom emp where num=@num;
优化方式:select id from emp with(index(索引名)) where name=@name;
7、where 子句中的“=”号左端对字段进行函数、运算、表达式操作。
例1:select id from t where num/2=100;
优化方式:select idfrom t where num=100*2;
例2:select id from emp where substring(name,1,3)=‘adb’;
优化方式:select idfrom emp where name like "abd%";
8、用 exists 代替 in 是一个好的选择。
例:select numfrom emp where num in(select num from b)
优化方式:select num from emp where exists(select 1 from bwhere num=a.num);