Mysql 'where 索引列=xx and 非索引列=yy' 有时候不走索引?
如题, 我一直以为 select * from 表 where 索引列=xx and 非索引列=yy
一定会走索引列的索引.
但是今天发现, 并不是这样.
经测试(MySQL 5.6.16):
- 当联合条件能够匹配到记录时, 走索引.
- 当联合条件不能匹配到记录时, 不走索引.
按照我的预期, mysql优化器用索引列扫描, 没有找到, 直接返回不就得了, 不用再管后面的非索引列了.
但是, 按照上面的测试来看, 很有可能是, 先走索引列, 发现没有对应的记录, 然后全表扫描了下.
另外, 即使使用了force index (索引列的索引)
依旧是上面的情形.
示例:
id
是索引列, content_type
是非索引列.
联合条件匹配无记录时
联合条件无匹配记录时
测试表的结构
开启prifiling后
执行SQL:select sql_no_cache * from 表 force index(primary) where id=5 and content_type='电话';
(联合条件匹配不到记录的场景)
查看profile信息:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你这个例子怎么看出没用索引呢?你的id和content_type列都属于主键索引的索引内容,也就是说,你的查询是在一个const table里面进行,所以查不到数据会显示Impossible WHERE noticed after reading const tables。其他情况一般是显示using where的。
这里的Impossible WHERE是告诉你,在主键索引里,没找到你想要的行,主键也是索引呢,别歧视他,老铁。
另外,你要做实验,应该用非主键索引来弄。
开启
profiling
后再执行看看,explain
和真实执行的可能不一样, 从截图上看 id 是主键并且是等值查询,会走索引才对, 把表结构拿出来看看profiling开启方法
====== 回复分割线 =======
上面说错一个地方,profiling 能看到执行使用资源,不能看到是否用索引
我在 5.7 版本(刚好测试环境有)下执行这个查询语句:
Extra
显示的是no matching row in const table
然后去官网看了一下
explain
的输出解析意思就是在唯一索引里面找不到相应的数据, 文档里面有说用到索引去查询,至于怎么证明,还没想到