2016-01-18 80 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

这个希望混合索引文件列完美工作。谢谢! –