Mysql之索引失效研究

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


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

贴上数据记录(索引列为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__一个有理想的程序员。

 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值