MySql没有性能问题
我在一个表上运行下面的查询,表中有大约100k行,使用NOT in,性能非常糟糕。有没有其他方法可以达到同样的效果MySql没有性能问题,mysql,Mysql,我在一个表上运行下面的查询,表中有大约100k行,使用NOT in,性能非常糟糕。有没有其他方法可以达到同样的效果 SELECT c.Id, c.Name, c.address, c.town, c.county, c.postcode, FROM contractor AS c inner join Order w on w.Id = c.Id WHERE (c.valid = 1) and c.Id not in (select w.Id from Order w) ORDER BY c.N
SELECT c.Id, c.Name, c.address, c.town,
c.county, c.postcode, FROM contractor AS c
inner join Order w
on w.Id = c.Id WHERE (c.valid = 1) and c.Id not in
(select w.Id from Order w) ORDER BY c.Name ASC
谢谢我个人看不到对代码的进一步改进,除了您可能希望为字段添加索引。一般规则是在
WHERE
子句中使用的列中添加索引。您似乎有一个到Order
的冗余内部联接我相信下面的查询将产生相同的结果,并可能提高性能
SELECT c.Id
, c.Name
, c.address
, c.town
, c.county
, c.postcode
FROM contractor AS c
left outer join Order w on w.Id = c.Id
WHERE (c.valid = 1)
and w.Id IS NULL
ORDER BY
c.Name ASC
此查询不应返回任何行。您的联接只获得与w.Id相等的c.Id(因此处于从订单w中选择w.Id中)。此外,还有一个语法错误(c.邮政编码后的“,”),我想这是TS想要的,+1。嗨,谢谢你的建议。不幸的是,在我发言时,它仍在运行(2-3分钟)。。。有没有办法使用NOT EXISTS?它可能很慢,因为您尚未为列编制索引。在c.Id和w.Id列上放置一个索引,您应该可以很好地执行。正如Lex所说,您可能需要为列编制索引。您应该查看查询计划以确认这一点。