我有一個類似於下面簡化的數據庫。我需要檢索列:col8,col9,col10,col11,COL12(我已經盤旋左連接優化
目前的,我;使用左男加入加入各表,但是這會導致查詢花了很長時間(有很多的記錄)。經分析,最大的影響是寫入TMP表。
我限制了結果24,但由於左加入它仍然複製幾千條記錄到tmp目錄表。
http://oberto.co.nz/demo/assets/db2.jpeg
這能優化仍檢索使用joinin每個表中的列盤旋g由pk?
謝謝。
我有一個類似於下面簡化的數據庫。我需要檢索列:col8,col9,col10,col11,COL12(我已經盤旋左連接優化
目前的,我;使用左男加入加入各表,但是這會導致查詢花了很長時間(有很多的記錄)。經分析,最大的影響是寫入TMP表。
我限制了結果24,但由於左加入它仍然複製幾千條記錄到tmp目錄表。
http://oberto.co.nz/demo/assets/db2.jpeg
這能優化仍檢索使用joinin每個表中的列盤旋g由pk?
謝謝。
SELECT a.col12, b1.col8, c1.col9, d1.col10, e1.col11
FROM a
INNER JOIN (SELECT b.col8, b.col2, b.col3 FROM b
WHERE b.col2 = a.col2 GROUP BY b.col8) b1
ON (b1.col2 = a.col2)
INNER JOIN (SELECT c.col9, c.col3, c.col4 FROM c
WHERE c.col3 = b1.col3 GROUP BY c.col9) c1
ON (c1.col3 = b1.col3)
INNER JOIN (SELECT d.col10, d.col4 FROM d
WHERE d.col4 = c1.col4 GROUP BY d.col10) d1
ON (d1.col4 = c1.col4)
INNER JOIN (SELECT e.col11, e.col6 FROM e
WHERE e.col6 = a.col6 GROUP BY e.col11) e1
ON (e1.col6 = a.col6)
現在您將不再有重複的行。
您可能需要嘗試使用LEFT
而不是INNER
連接。
如果你不需要子選擇,你應該消除它,因爲它會減慢速度。
在當前和最簡單的形式,我會作爲查詢...
SELECT STRAIGHT_JOIN
a.col1,
a.col12,
b.col8,
c.col9,
d.col10,
e.col11
FROM a
left join b
on a.col2 = b.col2
left join c
on b.col3 = c.col3
left join d
on c.col4 = d.col4
left join e
on a.col6 = e.col6
但是,一旦我在其他的標準,過濾器的條件下,左/內部連接「要求」讀回將調整這可能有助於進一步優化。
良好的形象;-)但我們仍然不知道任何關於您的表和索引。我想說,用於連接表的所有字段(ON子句)都應該使用主鍵,唯一鍵或索引來索引。 – Devart
哈哈,謝謝。我只是更新它使*希望*更清晰。每個表的第一列是主鍵,每個連接表都有一個對應的外鍵。 – Jarrod
@Devart - +1。如果索引正確應用,查詢應該是相當快的,除非還有其他事情涉及(按?排序?有?)。左連接不會比內連接更差。我們是否可以看到您正在使用的查詢以及哪些索引在哪裏? –