2011-05-20 83 views
0

如果这是我打算在我的数据库上运行的唯一查询,是否应该在MyTable索引中包含col3 & col4col4MySQL多列索引

Select MyTable.col3, MyTable.col4 
From MyTable 
Inner Join MyOtherTable 
On MyTable.col1 = MyOtherTable.col1 
And MyTable.col2 = MyOtherTable.col2; 

我使用的表格中有大约50万行。对于我的问题,col1 & col2是在这两个表中找到的唯一集合。

这里的示例表定义,如果你真的需要知道:

CREATE TABLE MyTable 
(col1 varchar(10), col2 varchar(10), col3 varchar(10), col4 varchar(10)); 

CREATE TABLE MyOtherTable 
(col1 varchar(10), col2 varchar(10)); 

所以,它应该是这个?

CREATE MyIdx ON MyTable (col1,col2); 

或者这个?

CREATE MyIdx ON MyTable (col1,col2,col3,col4); 

回答

2

添加列COL3和COL4不会帮助,因为你仅仅使用列col1和col2上找到他们后拉这些值。速度通常来自确保列col1和col2被索引。

,因为你不使用它们放在一起你实际上应该拆分这些索引:

CREATE MyIdx mytable上(COL1); CREATE MyIdx ON MyTable(col2);

我不认为在这种情况下组合索引将帮助你。

更正:我想我已经错过了,因为你打算只在这两个表上使用这个查询,并且从不单独加入各个列。在你的情况看来,你可以通过把它们放在一起来加快速度。以此为基准进行基准测试会很有意思,看看使用组合索引与单个索引组合时,您在1/2百万行中看到的加速有多少。 (你不应该在索引中使用列col3和col4,因为你没有加入任何东西。)

+0

在什么情况下,我需要一个综合指数? – VenerableAgents 2011-05-20 19:51:03

+0

伟大的一点,弗吉尼亚州,我认为你是对的。我注意到一个更正。干杯。 – 2011-05-20 20:17:12

2

查询返回从两个表加入的50万行永远不会很快 - 因为它是返回50万行。

col1,col2上的索引似乎是足够的(作为二级索引),但取决于您拥有的其他列,添加(col3,col4)可能使其成为,覆盖索引

在InnoDB中,可能会创建主键(col1,col2),然后将它聚类,这是一个胜利。

但是,如果您的查询再次加入500,000行并且没有其他WHERE子句,并且返回500,000行,它不会很快,因为它需要获取所有行以返回它们。

1

我不认为任何人提到这个问题,所以我补充说,你应该有两个表复合(col1,col2)指数:

CREATE MyIdx ON MyTable (col1,col2); 

CREATE MyOtherIdx ON MyOtherTable (col1,col2); 

另一点。在(col1,col2,col3,col4)索引会有所帮助,如果您需要使用您的查询的不同变化:

Select DISTINCT 
    MyTable.col3, MyTable.col4 
From MyTable 
Inner Join MyOtherTable 
On MyTable.col1 = MyOtherTable.col1 
And MyTable.col2 = MyOtherTable.col2;