在基表上使用索引

时间:2013-08-19 14:21:40

标签: mysql sql indexing

如果我有两个表,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子句来看到任何好处,但我不仅仅是一个有根据的猜测

2 个答案:

答案 0 :(得分:0)

即使通过加入A.ii也会获得任何收益,包括未编制索引的B.ii将会丢失。所以不,没有收获。

答案 1 :(得分:0)

MySQL支持index merge optimization,因此它可以使用B上的两个索引并找到它们之间的交集。当type: index_mergekeys: 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根本没有索引,这也有帮助。