2017-04-03 99 views
0

查詢運行時間超過10分鐘。MySQL,使用「NOT IN(SELECT ...)」進行查詢的速度很慢

SELECT * 
FROM tableA 
WHERE name NOT IN(
SELECT a.name 
FROM tableA a 
INNER JOIN tableB b ON a.code = b.code 
INNER JOIN tableC c ON c.number = b.number 
INNER JOIN tableD d ON d.code = b.code 
INNER JOIN tableE e ON e.content= d.content) 

是否有替代查詢運行更快或有任何解決方案?非常感謝。

回答

0

儘量不要存在

SELECT * 
FROM tableA t1 
WHERE not exists (
SELECT 1 
from tableB b 
INNER JOIN tableC c ON c.number = b.number 
INNER JOIN tableD d ON d.code = b.code 
INNER JOIN tableE e ON e.content= d.content 
where t1.code = b.code 

) 
+0

因爲表B中沒有列「名稱」,所以我只使用t1.code = b.code,而且效果很好。無論如何,非常感謝你 – Nina

+0

但這將是邏輯 – maSTAShuFu

3

只要提供了適當的索引,您的查詢應該可以正常工作。你可以嘗試使用左連接。

select a.* 
from tableA a 
left join (
    select distinct a.name 
    from tableA a 
    inner join tableB b on a.code = b.code 
    inner join tableC c on c.number = b.number 
    inner join tableD d on d.code = b.code 
    inner join tableE e on e.content = d.content 
    ) b on a.name = b.name 
where b.name is null; 

性能將主要取決於指標。 出於性能考慮,我建議以下指標:

create index idx_tablea_code_name on tableA(code, name); 
create index idx_tableb_code_number on tableB(code, number); 
create index idx_tablec_number  on tableC(number); 
create index idx_tabled_code_content on tableD(code, content); 
create index idx_tablee_content  on tableE(content); 
+0

沒有relplaced左加盟應該這樣做,而無需創建索引或沒有?只是問,因爲我認爲查詢將被執行的每個記錄,但這種方式查詢將只執行一次 – Cherif

+0

@Charif - 不,你的查詢不會像那樣執行(你正在談論的那個稱爲相關查詢)。有一段時間離開聯接比NOT IN更好。 – GurV

+0

我在表B中沒有列「名稱」,所以我在末尾使用了「a。code = b。code」而不是「a.name = b.name」,並且出現錯誤:#1054 - Unknown在'子句'中列'b.code'。但是,仍然感謝你的幫助。 – Nina