2017-04-03 419 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