MySQL多列索引

MySQL多列索引,mysql,indexing,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; 我正在使用的表中大约有50万行。就我的问题而言,col1和col2是两个表中唯一的一组 如果您真的需要知道

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

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);

添加列col3和col4不会有帮助,因为您只是在使用列col1和col2查找这些值之后才提取它们。速度通常来自确保列col1和col2被索引

实际上,您应该拆分这些索引,因为您没有同时使用它们:

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

我认为在这种情况下,综合指数对你没有帮助


更正:我想我说错了,因为您只打算在两个表上使用该查询,而从不将单独的列单独连接起来。在您的情况下,将它们放在一起似乎可以加快速度。对这一点进行基准测试,看看使用组合索引与单个索引相比,在120万行上可以看到多大的加速。(您仍然不应该在索引中使用col3列和col4列,因为您没有通过它们连接任何内容。)

添加col3列和col4列不会有帮助,因为您只是在使用col1列和col2列查找它们之后提取这些值。速度通常来自确保列col1和col2被索引

实际上,您应该拆分这些索引,因为您没有同时使用它们:

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

我认为在这种情况下,综合指数对你没有帮助


更正:我想我说错了,因为您只打算在两个表上使用该查询,而从不将单独的列单独连接起来。在您的情况下,将它们放在一起似乎可以加快速度。对这一点进行基准测试,看看使用组合索引与单个索引相比,在120万行上可以看到多大的加速。(您仍然不应该在索引中使用列col3和col4,因为您没有通过它们连接任何内容。)

从两个表连接返回50万行的查询永远不会很快,因为它返回50万行

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

在InnoDB中,可能需要生成主键(col1,col2),然后它将对其进行集群,这是一种胜利


但是再一次,如果您的查询不使用其他WHERE子句联接500000行,并返回500000行,那么它不会很快,因为它需要获取所有行才能返回它们。

从两个表联接返回50万行的查询永远不会很快,因为它返回50万行

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

在InnoDB中,可能需要生成主键(col1,col2),然后它将对其进行集群,这是一种胜利


但是再一次,如果您的查询不使用其他WHERE子句连接500000行,并返回500000行,那么它不会很快,因为它需要获取所有行才能返回它们。

我认为其他人没有提到它,所以我要补充的是,您应该在两个表上都有一个复合的
(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;

我想没有其他人提到过,所以我要补充的是,两个表上都应该有一个复合
(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;

在什么情况下我需要一个综合指数?很好,弗吉尼亚州,我想你是对的。我注意到一个更正。干杯。在什么情况下我需要一个综合指数?很好,弗吉尼亚州,我想你是对的。我注意到一个更正。干杯