java索引失效的情况_索引生效和失效的典型场景

1.能够使用索引的典型场景

频繁作为查询条件的字段应该创建索引,通常where后面的字段会建立索引。而有些情况不适合创建索引例如:

唯一性太差的字段不适合单独创建索引

select * from emp where sex='男'

频繁变化的字段不应该创建索引

select * from emp where logincount=1

能够使用索引的典型场景

①匹配全值

对索引中所有列都指定具体值。即是对索引中的所有列都有等值匹配的条件。

d0faacf3cb7b8c607bc9db3de7975779.png

select * from rental where inventory=373 and customer_id=343

②匹配值的范围查询

对索引的值进行范围查找

//执行计划的type:range

select * from rental where custom_id>=373 and custom_id<400

③匹配最左前缀

仅仅使用索引中的最左边列进行查找。比如在col1+col2+col3字段上的联合索引能够被包含col1、(col1+col2)、(col1+col2+col3)的等值查询利用,但不能被col2、(col2+col3)的等值查询使用到。

//

④仅仅对索引进行查询

当查询的列都在索引的字段中时,查询的效率更高。

//

⑤匹配列前缀

仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找。

//

⑥(Match one part exactly and match a range on another part)能够实现索引匹配部分精确而其它部分进行范围匹配

//

⑦如果列名是索引,那么使用column_name is null 就会使用索引

//

⑧Mysql5.6引入了Index Condition Pushdown(ICP)的特性,进一步优化了查询。

//

2.索引失效的典型场景

索引并不是创建后就一定会发挥作用,如果使用不恰当,则查询语句可能不利用索引来进行查询。下面是几种存在索引但不使用索引的典型场景。

①以%开头的LIKE查询不能够利用B-tree索引。这种情况,推荐使用全文索引(fulltext)。

select * from emp where last_name like '%NI%'(不会用索引)

②数据类型中出现隐式转换时不会用到索引。特别是当列类型为字符串时,一定要在where条件中将字符串常量值用引号引起来,否则不会用到索引。

//last_name为字符串类型//不存在隐式转换select * from actor where last_name='1'(会用到索引)//存在隐式转换select * from actor where last_name= 1 (不会用索引)

③复合索引的情况下,查询条件不满足最左原则(Leftmost)不会用到索引。

不满足最左原则(Leftmost),即查询条件不包含索引列最左边部分,这种情况是不能用到复合索引的。

select * from payment where amount=3.98 and last_update='2006-01-15 22:12:32(不会用索引)

④用or分隔的条件,如果or前条件中的列有索引,而后面的列没有索引,那么涉及的索引都不会被用到(前面的索引也不会用到)。

原因:

因为or后面的条件没有索引,必然会走全表扫描,在全表扫描情况下,就没有必要多一次索引扫描增加IO访问,一次全表扫描过滤条件就已经足够了。

//其中customer_id建立了索引,amount未建立索引

select * from payment where customer_id=203 or amount = 3.1 (不会用索引)

⑤如果Mysql估计使用索引比全表扫描更慢,则不使用索引。

11360de1201ce1c5f25e69cfb1c55d35.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值