MySQL索引使用限制
其他
2018-11-17 21:48:40
阅读次数: 0
MySQL索引使用限制
- 不要在列上进行运算。
select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select * from users where adddate<‘2007-01-01’;
- like语句操作
如果使用like。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
select * from users where name like '%aaa%'不会使用索引
select * from users where name like 'aaa%'可以使用索引
- 使用短索引
例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
- 索引不会包含NULL列
复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串
- 最左匹配
不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) ,where ‘c2’ = ‘aaa’ 不使用索引,where ‘c2’ = ‘aaa’ and ‘c3’ = ‘sss’ 不能使用索引。where ‘c1’ = ‘aaa’ and ‘c2’ = ‘bbb’ 可以使用索引
- 多列范围查询
查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)。where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 该查询只会使用索引中的前两列,c3将不能使用到索引,因为like是范围查询。
- 检索排序
一个查询语句中,既有检索又有排序并且是不同的字段,且这两个列上都有单列索引(独立索引),那么只有其中一个列用到索引,因为查询优化器在做检索和排序中不能同时使用两个不同的索引
- 索引散列度
通过索引扫描的记录超过了表总行数的30%(估计值),则查询优化器认为全表扫描的效率更高,所以会变成全表扫描查询
- 隐式转换
隐式转换导致的索引失效。比如,表的字段tu_mdn定义为varchar(20),但在查询时把该字段作为number类型当做where条件,这样会导致索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn='13333333333’;
转载自blog.csdn.net/wukong_666/article/details/79311770