微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该为同一列创建 2 个索引以加快连接速度吗?

如何解决我应该为同一列创建 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 table2table2 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 举报,一经查实,本站将立刻删除。