一、有索引而未被用到:
1、Like的参数以通配符%开头时,数据库引擎会放弃使用索引而进行全表扫描。
以通配符开头的sql语句,是全表扫描,没有使用到索引,不建议使用:
explain select * from teacher where tname like '%10';
不以通配符开头的sql语句,使用到了索引,是有范围的查找:
explain select * from teacher where tname like '10%';
2、where条件不符合最左原则:
假设有这样一个索引——(a,b,c),必须用到第一个字段a,才会走索引。否则如select * from table where b='b' and c='c',就不会使用到索引。
3、索引列使用 != 或 <> 操作符时,数据库引擎会放弃使用索引而进行全表扫描。使用>或<会比较高效。
4、在 where 子句中对索引列进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
5、在where子句中对索引列进行null值判断,引擎放弃使用索引而进行全表扫描。
如: 低效:select * from teacher where note is null ;
可以在note 上设置默认值0,确保表中note 列没有null值,然后这样查询:
高效:select * from teacher where note= 0;
6、在where子句中使用or来连接条件,导致引擎放弃使用索引而进行全表扫描。
如: 低效:select * from teacher where note = 12 or note = 122;
可以用下面这样的查询代替上面的 or 查询:
高效:select * from teacher where note = 12 union all select * from teacher where note = 122;
或者:select * from teacher where note in (12, 122);
标签:优化,note,索引,全表,sql,where,teacher,select From: https://blog.51cto.com/u_16178335/6715978