1

我有一个非常大的值表。让我们称之为 table 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子句。即使我调用其中一张表big,它实际上也有不到 500,000 行。我使用的测试用例查询没有使用在big(big has no value where foo='bar') 中找到的任何值,并且查询仍然花费了 7 秒。这真的很正常吗?对我来说似乎非常慢。

4

2 回答 2

2

我认为您将 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'bigWHEREJOIN

您可能想在没有这样的内部的情况下重写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'
于 2013-08-01T17:13:37.910 回答
1

稍微简化一下,你不能WHERE在 之前放一个子句JOIN,它需要根据语法规则放在它后面。优化器将找出最佳执行顺序,并且不一定按照您列出的顺序执行。

SELECT big.a, big.b, small.b as small_b, small.c, small.d 
FROM big 
LEFT JOIN small
  ON big.b = small.b
WHERE foo = 'bar';

编辑:如果查询很慢,没有命中或命中最少,可能的原因是缺少foo.

foo在, 和big.b和上添加一个索引,small.b你应该会看到加速。

于 2013-08-01T17:13:44.603 回答