mysql where中出现多个带索引的列时,内部原理是怎样的

tongqu 发布于 2016/08/29 14:51
阅读 243
收藏 0

存储引擎为innodb时,

为test表中a和b建立普通索引,test表会有a、b的BTREE索引放在内存中

那么,我在where a=1 and b=2的时候,mysql究竟是怎么同时用到两个索引的?

有人说mysql会选择最小结果集的某个索引,而不会同时用到,

可是,explain的时候 key 为什么有两个

加载中
0
逝水fox
逝水fox

这种情况一般来说type应该是index_merge,Index Merge的一个部分是当两个索引不易判断出那个最优的情况,MySQL会尝试分别使用两个索引查询后结果集求交集。

相关内容可以读一下这个

http://dev.mysql.com/doc/refman/5.7/en/index-merge-optimization.html

0
o
oneflower
如果a,b列上分别建立了独立索引,那么where a=1 and b=2的时候,两个索引都会用到,即使是常量。
如果a,b联合其他列建立了联合索引,如果a列,b列不是索引的第一个列,那么不走索引。
如果a,b建立了联合索引,且a列在前,则where a=1 and b=2的时候会走该联合索引。

参考自:
MySQL怎样优化WHERE子句
返回顶部
顶部