我有一张很大的价值表。我们把那张表叫做big
。我有一个更小的表,叫做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
,它实际上有不到500000行。我使用的测试用例查询没有使用在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'
将被优化为仅对由条件筛选的
big
行执行联接,而不是对整个foo='bar'
执行联接,尽管big
子句在WHERE
之后以文本形式出现。您可能需要重写此文件,而不需要像这样的内部
JOIN
: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/