Mysql之索引失效研究

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33861603/article/details/85626776

!!!作者必须声明,做一个实践党而不是在互联网传播经不起考验的博客内容,尤其转载等内容。


关于索引失效,最近做了些微薄研究,希望自己浅陋的知识能给别人带来参考。。。。。我爱开源

贴上数据记录(索引列为name,dept)

         

             

两个索引列区别:name列值不重复,dept列值重复。

以后通过explain select...语句来描述失效原因

查看sql性能方面,一般看type,key,rows,extra这四个列,type代表数据库引擎查找表的方式,key代表查询用到的索引的名字,rows代表扫描记录的次数,extra作为判断是否覆盖索引。extra: using index表示覆盖索引

***注意点***

覆盖索引必须满足条件:索引能存储索引的列的值。这意味着哈希索引、空间索引、全文索引等这类不存储索引列的值的索引不能覆盖,所以只有B-Tree索引适合。一般用于无where条件时需要优化的情况下。

type常见值(all,index,range,ref,eq_ref,const);index类似于all,只是多了排序

一。一些关键字导致的

1.is null和is not null,!=,<> 语句比较如下

====================================================

explain select name from user2 where name is not null;(type:index,key:存在,rows:8;索引生效了,但是跟全表扫描没啥大差距,性能差要优化)

解决方案:禁用is null等判断,@代替用常量如0判断为空,@或者建立索引时以默认常量代替null如下

create index xxx on table名(col,常量值)

explain select name ,dept from user2 where name is not null;(type:all,index:不存在,rows:8,索引失效)

explain select * from user2 where name is not null;(type:all,index:不存在,rows:8,索引失效)

扩展:

1.MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。

以上sql优化的总结:

1.避免使用*

2.where从句后若包含is null等关键字时必须覆盖索引l代替"*"。

3.or的条件列都必须是索引列

4.order by满足两种情况会使用Using index

#1..order by语句使用索引最左前列(没有where条件就必须覆盖索引)。

#2.使用where子句与order by子句条件列组合满足索引最左前列(即where条件列必须属于order by里的列且order by列要满足索引创建顺序)。

5.尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最佳左前缀法则。

6.如果order by的条件不在索引列上,就会产生Using filesort(where索引条件列不存在的话)。

=========================================================

比你优秀的人比你还努力,你有什么资格不去奋斗!

Me__一个有理想的程序员。

=========================================================

====================================================

猜你喜欢

转载自blog.csdn.net/qq_33861603/article/details/85626776