Mysql索引的使用

一,最左匹配原则

如果为联合索引 create index table on (a,b,c)

例:select * from table where a ='' and b= '' and c= ''索引是生效的
例:select * from table where a = '' and c='' 这样只有索引a生效,索引c失效
例:select * from table where c='' 索引全部失效,不符合最左匹配法则

此联合索引创建了3个索引 分别为 a索引。a,b索引。a,b,c索引,他们都是一个整体。所以按照最左匹配法则,a列在作为查询条件时,就能触发索引

二,索引失效情况(引用上面的a,b,c索引)

1.(范围查询) select * from table where a = '' and b>'' and c='' 此时只有a,b索引生效。
2.(对列进行运算操作) select * from table where substring(a,3,2); 索引失效
3.(数字为varchar类型不加单引号) select * from table where a=5; a为varchar类型
4.(or查询) select * from table where a ='' or b='' 如果a列有索引,b列无索引,则整个索引失效
5.(like查询) select * from table where a like '%1%';%在前面 索引失效,
如果非要前后都加上% ,则可使用覆盖索引来解决
覆盖索引: select a from table where a like '%1%';

三,尽量使用覆盖索引 避免select * 回表查询

1.select * from table where a ='' 走了索引,但是需要回表查询(using index condition)
2.select a,b,c from table where a ='' 不需要回表查询,效率更高 (覆盖索引查询)

四,全表扫描有时比索引更快

如果表中某列大量重复出现,sql执行计划会判定全表扫描比走索引效率高

五,is null,is not null有时走索引,有时不走索引

如果表中null值居多, is not null走索引,反义依然

六,in走索引,Not in不走索引

七,尽量使用复合索引

create table index table on (a,b,c)等于创建了3个索引
a,a+b,a+b+c索引。

八,查看索引使用情况

show global status like 'handler_read%'

你可能感兴趣的:(Mysql索引的使用)