为了账号安全,请及时绑定邮箱和手机立即绑定

在线等!MySQL覆盖索引时允许索引执行LIKE操作吗?大佬们有什么好的建议?

在线等!MySQL覆盖索引时允许索引执行LIKE操作吗?大佬们有什么好的建议?

拉莫斯之舞 2019-09-19 22:26:15
问题描述:学习时,p172举例explainselect*fromproductsfromactor='SEANCARREY'andtitlelike'%APOLLO%',解释这里索引无法覆盖该查询的原因其中第二个是:MySQL不能在索引中执行LIKE操作.但是我实际发现,即使索引执行了LIKE也是可以覆盖索引的!演示代码:--基于MySQL版本:8.0.16--创建一个只有2个字段的表droptableifexistsproducts;createtableproducts(actorvarchar(20),titlevarchar(20));--创建覆盖所有字段的索引,并未指定索引长度createindexidx_actor_titleonproducts(actor,title);--索引执行LIKE操作,查看explain结果explainselect*fromproductswhereactor='SEAN'andtitlelike'%APOLLO%';执行结果是:Extra是Usingwhere;Usingindex,所以说即使执行了LIKE也还是覆盖索引请问是MySQL版本的问题吗,还是我的理解有问题?感谢!
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

覆盖索引是因为表字段就2个,都被索引包含,但只用到了索引第一列actor,可以查看EXPLAIN的ref字段,只有一个const
                            
查看完整回答
反对 回复 2019-09-19
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

覆盖索引采用b+tree,上层是actor,actor子叶是title,所以判断是采用了索引。
like是可以采用索引的,如果你用b+tree,可以用like'AP%',这样规定字段开头是可以命中b+bree,因为b+tree本来就是按照顺序存储。
ps:并不是所有的like都是洪水猛兽!
                            
查看完整回答
反对 回复 2019-09-19
  • 2 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号