mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

 我是小羊同学,一个兢兢业业的程序员

背景:有一天同事突然问我为什么加了in查询就突然变慢了、小羊脱口而出:“in不走索引!” 于是就炸开了锅:in不走索引!怎么可能? 但是在小羊同学脑子里、in不走索引为什么早就根深固体了?原因暂且不说,我们来探索真像。

环境:Windows10、MySQL5.7、可视化工具navicat。

场景1:当IN中的取值只有一个主键时

c88e2f8089ce4de7971a00459e3ffbb7.png

我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引:

type:连接类型(建议记到小本本上)

  • system:表只有一行记录,相当于系统表

  • const:通过索引一次就找到,只匹配一行数据

  • eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配

  • ref:非唯一性索引扫描,返回匹配某个单独值的所有行用于=、 操作符带索引的列

  • range:只检索给定范围的行,使用一个索引来选择行一般使用 between、

  • index:只遍历索引树

  • ALL:全表扫描,性能最差    

场景2:扩大IN中的取值范围

7cc580a7f90c5b799434cc52f296a7fc.png

此时仍然走了索引,但是效率明显降低了

场景3:继续扩大IN的取值范围

1f05612af2d6f3e628c9412ff55471cd.png

发现此时已经没有走索引了,而是全表扫描

结论:

当数据量很大的时候,in("大量数据"),in 查询走索引也许不是最好的

但是!

当查询的列是char类型,必须加""号才可走索引,否则导致全表扫描,会随着表的增大而变得更慢

结论:

  • 当in()中的数据很大时,不走索引

  • 当查询的列是char类型没有加引号,mysql优化器会自动给填充引号,同时也会导致索引失效

  • 当in()中存在子查询、格式化函数等同样也会使索引失效!

e9292f29191b456f9cf15fe2c57020d7.png

end

ac45211b53ee2926d3f5fdfd0954aea0.png

*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

55e5ed1987919d0fcabc1cd7bf91a57a.gif

好文!必须在看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值