我有兩個表,每個包含6M行。我試圖加入兩個使用內部連接,但查詢運行了2天沒有完成。中的連接的(請注意我用count(*)
只是爲了讓我跑的解釋,實際上,我在CTAS使用join
):MySQL內部連接非常慢的查詢
SELECT count(*)
FROM table1 t1,
table2 t2
WHERE t1.col1 = t2.colA
AND t1.col2 = t2.colB;
有點調查後我發現下面的查詢運行良好:
SELECT count(*)
FROM
(SELECT *
FROM table1) t1,
(SELECT *
FROM table2) t2
WHERE t1.col1 = t2.colA
AND t1.col2 = t2.colB;
,代替表之間唯一的區別,我使用子查詢SELECT * FROM table
;
運行解釋計劃顯示後者查詢在選擇table2時構建索引。而第一個查詢使用連接緩衝區(塊嵌套循環)。
當然,MySQL很聰明,可以確定兩個查詢幾乎完全相同,並且對兩個查詢都做同樣的事情?我不明白爲什麼需要索引,因爲無論如何都需要全面掃描這兩個表。這些是臨時/暫時表格,所以如果我確實放了一個索引,它實際上就是執行這個連接。
有沒有辦法通過MySQL配置來解決這個問題?
你可以爲兩個選擇發佈解釋嗎?你的mysql的版本是什麼? – Shadow