我有一个非常大的值表。我们称该表为大
。我有一个较小的表,称为 small
。我想加入这些表,但仅限于 big
内的特定值。
我可以通过说来获取值
SELECT a,b FROM big WHERE foo='bar';
我想用 small
加入那个结果,说这样的话:
SELECT a,b FROM big WHERE foo='bar'
LEFT JOIN (SELECT b as small_b,c,d FROM small) ON big.b=small.small_b
我不想把所有东西都放在 big
中,因为那是很多东西并且需要半分钟。我只需要那个小子集。我该怎么做呢?
编辑:我已经编辑了我的查询以匹配末尾的 WHERE
子句。尽管我将其中一个表称为大
,但它实际上只有不到 500,000 行。我使用的测试用例查询没有使用在 big
中找到的任何值(big 在 foo='bar' 处没有值),并且查询仍然花费了 7 秒多的时间。这真的很正常吗?这对我来说似乎非常慢。
最佳答案
我认为您将 SQL 的语法误认为是 RDBMS 引擎执行的执行流程:这个查询
SELECT a,b FROM big b
LEFT JOIN (SELECT b as small_b,c,d FROM small) ON big.b=small.small_b
WHERE b.foo='bar'
将被优化为仅对 foo='bar'
条件过滤的 big
的行执行连接,而不是对整个 big
,尽管 WHERE
子句以文本形式出现在 JOIN
之后,但任何值得一提的查询优化器。
你可能想在没有内部 SELECT
的情况下重写它,如下所示:
SELECT t1.a as big_a, t1.b as big_b, t2.b as small_b, t2.c, t2.d
FROM big t1
LEFT JOIN small t2 ON t1.b = t2.b
WHERE t1.foo='bar'
关于mysql - WHERE 子句后跟 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000389/