mysql一次查询能用多个索引吗?

mysql一次查询能用多个索引吗?

策马西风 发布于 2021-11-28 字数 633 浏览 866 回复 5
SELECT * FROM t1 WHERE key1 < 10 OR key2 < 20 or key3 < 30;#index_merge
SELECT * FROM t1 WHERE (key1 < 10 OR key2 < 20) and key3 < 30;#range

比如以上有三个,后面的#是explain 后的type,本人亲测。

1、mysql只会选择其中的一个作为索引?

2、index_merge类型和range类型都是只用一个key作为索引吗?

3、如何从一个sql语句大致判断它会是index_merge查询 还是 range查询?为什么上面把or 换成 and 就变成了 range查询? 

mysql版本5.5.43

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

千笙结 2021-12-01 5 楼

有个疑问。1中你说‘一个真实查询请求只能选定一个索引来访问’,二中你说‘可以出现一个sql用多个索引来查询’。1和2不是矛盾的吗

明媚如初 2021-12-01 4 楼

回复
index_merge遇到or的情况,他可以选择将一个查询拆开成两个分别的查询,然后再union实际上这时真实的查询是两个

不再见 2021-12-01 3 楼

回复
如何了解这些?(什么途径,手册?书中?源码?其它?)

梦里兽 2021-11-30 2 楼

回复
有本书可以看看《MySQL技术内幕:InnoDB存储引擎(第2版)》

毁梦 2021-11-28 1 楼

InnoDB引擎的数据结构决定一个真实查询请求只能选定一个索引来访问。

index_merge 实际分为很多种,具体可以看看optimizer_switch这个配置项的标记说明。他可以出现一个sql用多个索引来查询(对多个索引or的情况,查询优化器会考虑把查询在底层拆分成两个查询 结果做union,这时反映出来就是explain的key是多个键,但他会考虑数据分布的情况来自信判断)

问题三... 没什么为什么 mysql的优化器觉得range更好。并不是达到什么sql组合就一定会用什么优化,优化器会根据实际数据的情况预估选择它认为最好的方案。