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