在联接表上进行选择的JOIN查询是否受益于索引



这是一个非常简单的问题,但我在互联网上很难找到直接的答案。

假设我有两张桌子:

article - id, some other properties
localisation - id, articleId, locale, title, content

1篇文章有很多本地化,在locale上有一个索引,我们想用locale过滤。

我的问题是,是否通过文章进行查询,并使用where子句加入本地化,如以下所示:

SELECT * FROM article AS a JOIN localisation AS l ON a.id = l.articleId WHERE l.locale = 5;

locale索引中获得的好处与反向查询相同:

SELECT * FROM localisation AS l JOIN article AS a ON l.articleId = a.id WHERE l.locale = 5;

还是我需要做后者来正确使用我的索引?当然,假设基数是正确的。

默认情况下,您在查询中指定表的顺序不一定是它们的联接顺序。

内部联接是可交换的。也就是说,A JOIN BB JOIN A产生相同的结果。

MySQL的优化器知道这一事实,如果它估计按照与您在查询中列出的表相反的顺序联接表会是一个成本较低的查询,那么它可以对表进行重新排序。您可以指定优化器提示以防止它重新排序表,但默认情况下会启用此行为。

使用EXPLAIN将告诉您优化器对于给定查询更喜欢使用哪个表顺序。在某些边缘情况下,优化器可能会选择一些您没有预料到的东西。优化器的一些估计取决于表中数据值的频率,因此您应该在自己的环境中进行测试。

附言:我想这个查询可能会受益于对列的复合索引:(locale, articleId)

最新更新