MySQL多列索引

时间:2011-05-20 19:22:09

标签: mysql indexing

我应该加入col3&如果这是我打算在我的数据库上运行的唯一查询,col4中的索引MyTable

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

我正在使用的表中有大约五十万行。就我的问题而言,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);

3 个答案:

答案 0 :(得分:2)

添加列col3和col4将无济于事,因为您只是在使用列col1和col2找到它们之后提取这些值。速度通常来自确保列col1和col2被索引。

你应该实际拆分这些索引,因为你没有一起使用它们:

在MyTable上创建MyIdx(col1); 在MyTable上创建MyIdx(col2);

在这种情况下,我认为组合索引不会对您有所帮助。

更正:我想我已经错过了,因为您打算在这两个表上仅使用该查询,并且不会单独连接各个列。在你的情况下,看起来你可以把它们放在一起加快速度。对此进行基准测试以了解使用组合索引与单个索引在150万行中看到的加速比有多大是有趣的。 (你仍然不应该在索引中使用列col3和col4,因为你没有通过它们加入任何东西。)

答案 1 :(得分:2)

从两个表连接返回50万行的查询永远不会非常快 - 因为它返回了50万行。

col1,col2上的索引似乎已足够(作为辅助索引),但根据您拥有的其他列,添加(col3,col4)可能会使其成为覆盖索引

在InnoDB中,它可能是制作主键(col1,col2),然后它会聚集它,这是一种胜利。

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

答案 2 :(得分:1)

我认为没有其他人提及它,所以我补充说你应该在两个表上都有一个复合(col1,col2)索引:

CREATE MyIdx ON MyTable (col1,col2);

CREATE MyOtherIdx ON MyOtherTable (col1,col2);

另一点。如果您需要使用查询的DISTINCT变体,(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;