mysql 存在索引但不能使用索引的典型场景

**

以%开头的LIKE查询不能够利用B-tree索引

**

explain select * from actor where last_name like '%NI%'G;

clipboard.png

explain select * from actor where last_name like 'NI%'G;

解决办法
先扫描索引 last_name获取满足条件的%NI%的主键actor_id列表,之后根据主键回表去检索记录,这样访问避开了全表扫描actor表产生的大量IO请求。

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

clipboard.png

数据类型出现隐式转换

explain select * from actor where last_name=1G;

clipboard.png

explain select * from actor where last_name='1'G;

clipboard.png

复合索引的情况下,查询条件不满足索引最左的原则

explain select * from payment where amount=3.98 and last_update='2016-02-15 22:12:32'G;

clipboard.png

Mysql估计使用索引比全表扫描慢

update film_text set title =concat('S',title);

explain select * from film_text where title like 'S%'G;

clipboard.png

可以看出全表扫描需要访问的记录rows为1000,代价cost计算为233.53;

通过idx_title_desc_part索引扫描访问记录rows为998,代价cost为1198.6 要高于全表扫描的时间,mysql会选择全表扫描

clipboard.png

用or分割开的条件,or前条件有索引,or后的列没有索引

用or分割开的条件,or前条件有索引,or后的列没有索引,那么涉及的索引不会被用到

因为or后面的条件没有索引,那么后面的查询肯定要进行全表扫描,在存在全表扫描的情况下,就没有必要多一次索引扫描增加IO访问。

explain select * from payment where customer_id =203 or amount=3.96G;

clipboard.png

**

负向查询(not , not in, not like, <>, != ,!>,!< ) 不会使用索引

**

**

独立的列 索引 不能是表达式的一部分

**

select * from xxxx where id+1;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值