MySQL索引使用限制有哪些?
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’;