我有一张很大的价值表。我们把那张表叫做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/

10-14 18:13