如果我有两个表,A和B,其中A在A.i和A.ii上被索引,而B在B.i上被索引,我运行以下查询:
SELECT *
FROM A JOIN B
on A.i = B.i
据我所知,这将使用B上的索引,但如果我使用以下查询,我会获得任何性能提升(即,使用A上的索引)吗?
SELECT *
FROM A JOIN B
on A.i = B.i AND A.ii = B.ii
我的直觉告诉我没有,this MySQL文档表明我需要在Ai和A.ii上使用WHERE子句来看到任何好处,但我不仅仅是一个有根据的猜测
答案 0 :(得分:0)
即使通过加入A.ii也会获得任何收益,包括未编制索引的B.ii将会丢失。所以不,没有收获。
答案 1 :(得分:0)
MySQL支持index merge optimization,因此它可以使用B上的两个索引并找到它们之间的交集。当type: index_merge
和keys: i,ii
时,你会在EXPLAIN输出中注意到这一点,并且Extra
字段中还会有一个注释显示它正在使用交集。
但是如果将等式比较组合为AND
项,则在列对上定义复合索引要好得多。
见http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/
MySQL 5.6还提供了index condition pushdown,在某些情况下,即使你只有B.i上的索引,而且B.ii根本没有索引,这也有帮助。