2013-08-01 141 views
1

我有一個非常大的值表。我們稱之爲表big。我有一個叫做small的小表。我想加入這些表格,但僅限於big內的特定值。WHERE子句跟在JOIN

我可以說

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沒有值,其中foo ='bar')中找到的任何值,並且查詢仍然花費了7秒鐘。這真的很正常嗎?對我來說,這似乎非常緩慢。

回答

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' 

將進行優化,以執行只能加入到bigfoo='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' 
+0

您是否有機會爲我的編輯更新您的回覆?我知道我不應該改變這樣的問題,但我想弄清楚爲什麼它如此緩慢...... – MirroredFate

+0

@MirroredFate我假設你有'foo'上的索引,對吧?否則,這將是一個全表掃描,看到加入是完全沒有行。 – dasblinkenlight

+0

我以爲我做到了。我只是檢查了一下,顯然我只有foo作爲唯一鍵的一部分...所以我開始爲foo開始索引操作,並且它仍在運行......這應該有所幫助。假設一切正常,我會讓你知道在索引操作之後查詢需要多長時間。 – MirroredFate

1

稍微simplifed,你不能JOIN之前把WHERE條款,它需要根據語法規則後它去。優化器會根據執行的最佳順序進行計算,並且不一定按照您列出的順序執行。

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.bsmall.b都應該看到加速。