mysql优化探索(5)在mysql中正确的创建索引2(sql优化)

一、这篇文章是上篇文章的延续,学习一下mysql什么时候用不到索引

1.使用like 然后跟开头有%的模糊查询时用不到索引,比如:

explain select * from actor where last_name like '%NI%'\G这条语句是用不到索引的,因为B-Tree索引的结构没法使用模糊匹配:

解决方法就是用全文索引,或者使用Innodb存储引擎的表的聚簇表特点进行处理。这里我们先说一下什么是聚簇索引,在Innodb存储表,都存在一个聚簇索引,比如主键和唯一id,或者建表时自动建立的row-id行。而聚簇索引和普通索引关系是:一个普通索引一定包含着聚簇索引。

根据以上描述,我们就可以改写上面的sql了,我们先使用last_name列上的idx_actor_last_name索引查出匹配 like '%NI%'的聚簇索引字段,也就是actor_id字段,因为这个字段是聚簇索引,所以要比查询全表快的多,然后再从匹配的记录中用获取的聚簇索引字段actor_id查找整个表,这样会比扫描全表找模糊匹配快的多。

explain select * from (select actor_id from actor where last_name like '%NI%') a, actor b where a.actor_id=b.actor_id\G

2.数据类型隐式转换了不会用到索引,比如某个字段是字符类型,而你写sql时赋值了个没有带引号的数字,这个时候就不会用到索引:

3.复合索引,不包含最左原则不会用到索引

4.如果mysql估计扫描全表时要比扫描索引时性能更好就不会用索引扫描。

5.用or关键字查询时,or前后的列索引有或者没有的状态不统一不会用到索引,比如or前面的列有索引,or后面的列没索引这样就不会用到索引。

二、查看mysql使用索引的情况。

1.Handler_read_key的值代表一个行被索引值读取的次数,这个值越高表用用到索引的效率高,如果这个值坻就需要改善索引了。

2.Handler_read_rnd_next的值代表数据文件中读下一行的请求数,这个值越高,说明用到索引的效率越低,如果这个值高的话就说明mysql正在挨顺序查找数据,这个时候我们也要改善索引了。

下面这种情况就说明索引的使用情况不佳:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值