0

如果我有两个表 A 和 B,其中 A 在 Ai 和 A.ii 上建立索引,而 B 在 Bi 上建立索引,我运行以下查询:

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 

我的直觉告诉我不,这个MySQL 文档建议我需要在 Ai 和 A.ii 上使用 WHERE 子句才能看到任何好处,但我想要的不仅仅是有根据的猜测。

4

2 回答 2

0

MySQL 支持索引合并优化,因此它可以使用 B 上的两个索引并找到它们之间的交集。您会在 EXPLAIN 输出中注意到这一点,type: index_merge并且keys: i,ii该字段中还会有一条注释Extra显示它正在使用交集。

但是,如果您将相等比较组合为AND术语,那么在这对列上定义一个复合索引要好得多。
http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/

MySQL 5.6 还提供了索引条件下推,这在某些情况下会有所帮助,即使您在 Bi 上只有一个索引,而 B.ii 根本没有索引。

于 2013-08-19T14:33:02.127 回答
0

即使在 A.ii 上也加入会带来任何收益,但在包含未索引的 B.ii 时也会失去。所以不,没有收获。

于 2013-08-19T14:29:22.823 回答