如何解决我应该为同一列创建 2 个索引以加快连接速度吗?
我是数据库索引的新手,我刚刚阅读了关于什么是索引、聚集索引和非聚集索引之间的区别以及复合索引是什么的内容。
对于这样的内部连接查询:
SELECT columnA
FROM table1
INNER JOIN table2
ON table1.columnA= table2.columnA;
为了加速 join
,我应该创建 2 个索引,一个用于 table1.columnA
,另一个用于 table2.columnA
,还是只为 table1
创建 1 个索引或table2
?
一个就够了吗?我不明白,例如,如果我首先从 table2
中选择一些数据并根据结果加入 columnA
,那么我将从 {{1} 中逐一循环结果},那么来自 table2
的索引在这里完全没用,因为我现在不需要在 table2.columnA
中找到任何东西。所以我需要 table2
的索引。
反之亦然,如果我先从 table1.columnA
中选择一些结果并想加入 table2.columnA
,我需要一个 table1
。
好吧,我不知道在现实中“先选择 xxxx 然后根据...加入”看起来如何,但我想到了这种情况。如果有人也能举一个简单的例子,将不胜感激。
解决方法
一个索引就足够了,但问题是哪个?
这取决于 MySQL 优化器如何决定对连接中的表进行排序。
对于内连接,table1 INNER JOIN table2
和 table2 INNER JOIN table1
的结果相同,因此优化器可能会选择更改顺序。按照您在查询中指定的顺序连接表不受限制。
从索引的角度来看,不同之处在于它是先循环 table1 的行,然后查找 table2 中的匹配行,反之亦然:循环 table2 的行并查找 table1 中的行。
MySQL 确实以“嵌套循环”的形式加入。就好像你用你最喜欢的语言写了这样的代码:
foreach row in table1 {
look up rows in table2 matching table1.column_name
}
此查找将使用 table2 中的索引。 table1 中的索引与此示例无关,因为您的查询无论如何都会扫描 table1 的每一行。
你怎么知道使用的是哪个表顺序?您可以使用 EXPLAIN
。它将为查询中的每个表引用显示一行,并按连接顺序显示它们。
请记住,任一表中是否存在索引可能会影响优化器对表排序方式的选择。它将尝试选择导致查询成本最低的表顺序。
所以也许将索引添加到哪个表并不重要,因为无论您将索引放在哪个表上,都将成为连接顺序中的第二个表,因为这样可以更有效地进行查找。使用 EXPLAIN 找出答案。
,在设计合理的关系数据库中,90% 的情况下,您连接在一起的两列之一是主键,因此应该为其构建聚集索引。
因此,只要您处于这种情况,您就根本不需要做任何事情。添加其他非聚集索引的唯一原因是,如果您还在语句末尾使用 where
子句进一步过滤连接,则需要确保连接列和过滤列都在正确的索引(即正确的排序顺序等)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。