【发布时间】:2021-04-29 10:18:24
【问题描述】:
我是数据库索引的新手,我刚刚了解了索引是什么、聚簇和非聚簇之间的区别以及复合索引是什么。
所以对于像这样的内连接查询:
SELECT columnA
FROM table1
INNER JOIN table2
ON table1.columnA= table2.columnA;
为了加快join的速度,我应该创建2个索引,一个为table1.columnA,另一个为table2.columnA,还是只为table1或table2创建1个索引?
一个就够了?我不明白,例如,如果我先从table2 中选择一些数据,然后根据结果加入columnA,然后我会从table2 中逐一遍历结果,然后从table2.columnA 在这里完全没用,因为我现在不需要在 table2 中找到任何东西。所以我需要table1.columnA 的索引。
反之亦然,如果我先从table1 中选择一些结果并想加入columnA,我需要table2.columnA。
好吧,我不知道实际上“先选择 xxxx,然后根据...加入”看起来如何,但我脑海中浮现出这种情况。如果有人也可以举一个简单的例子,将不胜感激。
【问题讨论】:
-
通常一个表上的索引就足够了,但您可能会发现两个索引更好。测试您的数据,看看什么效果最好。
-
@GordonLinoff 让我添加更多细节。
-
在这里考虑哪个表可以为嵌套循环提供更好的驱动表:如果它以 Table1 开头,它将获得少量行,这将在 Table2 中返回比读取所有行少得多的行表2第一?是否会因为任一表中的每一行在另一表中都有匹配的行而大致相同? MySQL 可以进行哈希连接(最后),因此嵌套循环可能不是最好的主意,但列上的索引可以为数据库提供更少量的数据来读取(只是整个索引而不是整个表)。您的实际查询也可以重写为使用
intersect。 -
@AndrewSayer MySQL 不支持
insersect关键字或操作。
标签: mysql sql join indexing query-optimization