我有一张非常大的价值表。我们称之为表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
中找到的任何值(大的没有值,其中foo ='bar'),查询仍然需要7秒钟。这真的很正常吗?对我来说似乎非常缓慢。
答案 0 :(得分: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'
行执行连接,而不是对整个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'
答案 1 :(得分: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
上添加索引,您应该会看到加速。