2016-01-18 128 views
0

我有2個表,我試圖比較。這些表是相同的結構,並且應該與每個60,000個條目完全相同。但是有些條目是不同的,我想找到問題。我目前正試圖對每個人進行左連接並顯示結果。我目前正在獲取結果,但每個查詢需要12分鐘。SQL左連接需要12分鐘

表1(temp_entries)

ID | File 

表2(temp_dir_scan)

ID | File 

查詢1(12.25分鐘)

SELECT A.ID, A.File 
    FROM temp_entries A 
    LEFT JOIN temp_dir_scan B ON A.File = B.File 
WHERE B.File is Null 

查詢2(12.26分鐘)

SELECT A.File 
    FROM temp_dir_scan A 
    LEFT JOIN temp_entries B ON A.File = B.File 
WHERE B.File is Null 

查詢3(11.54分)

SELECT A.ID, A.File 
    FROM temp_entries A 
Where A.File not in (select B.File from temp_dir_scan B) 

這是怎麼回事?或者我能做些什麼來加快速度?什麼是合理的時間來完成這個?

這裏是結果的例子。

1|test.txt 
2|test2.txt 
45|temp.jpg 
+0

請顯示EXPLAIN SELECT的結果A.ID,A.File FROM temp_entries A LEFT JOIN temp_dir_scan B ON A.File = B.File WHERE B.File爲空 ,同時也解釋選擇A.File FROM temp_dir_scan A LEFT JOIN temp_entries B ON A.File = B.File WHERE B.File是空的,所以我們可以看到發生了什麼 –

+1

您可以在文件'File'上創建索引 – HubertL

+0

您可以嘗試not in子句:SELECT A.ID, A.File FROM temp_entries A.Filenot in(從temp_dir_scan B中選擇B.File) – bdn02

回答

1

正如在評論中提到,你可以嘗試做一個FULL OUTER JOIN,一個示例使用如下所示的表格

修訂(FULL連接,以便使用UNION來模擬此MySQL沒有):要刪除重複的列錯誤

SELECT C.A_ID 
    , C.A_File 
    , C.B_ID 
    , C.B_File 
    FROM (
    SELECT A.ID AS A_ID 
      ,A.File AS A_File 
      ,B.ID AS B_ID 
      ,B.File AS B_File 
     FROM temp_entries A 
     LEFT 
     JOIN temp_dir_scan B 
     ON A.File = B.File 
    UNION 
    SELECT A.ID AS A_ID 
      ,A.File AS A_File 
      ,B.ID AS B_ID 
      ,B.File AS B_File 
     FROM temp_entries A 
    RIGHT 
     JOIN temp_dir_scan B 
     ON A.File = B.File 
     ) C 
WHERE C.A_File IS NULL 
    OR C.B_File IS NULL 

SO post提供了有關在MySQL做FULL OUTER JOINS更多信息。

希望這有助於

注:不確定相比,原來的查詢(IES)是多少性能提升的觀察。

+0

這個希望混合索引文件列完美工作。謝謝! –