使用左连接的Mysql查询速度太慢

使用左连接的Mysql查询速度太慢,sql,mysql,join,query-optimization,Sql,Mysql,Join,Query Optimization,查询: 两个表都有8k记录,但为什么速度很慢,有时需要2-3分钟甚至更长时间 天哪,这个查询使mysql服务器停机。将在一秒钟内返回给你们: 所有建议为这些列编制索引的人都是正确的。 是的,我写的问题很愚蠢,而且有问题。谢谢你纠正我。你真的需要这个吗!=或者它是注定的= 这将选择两个表的近似笛卡尔积。我猜大概有6000万排 编辑:来自评论 是的以匹配tbl_rls.id 这些不在tblc\u评论\u经理中 我认为如果你想使用外部连接方法,这就是你需要的 select `r`.`id` as `

查询:

两个表都有8k记录,但为什么速度很慢,有时需要2-3分钟甚至更长时间

天哪,这个查询使mysql服务器停机。将在一秒钟内返回给你们:

所有建议为这些列编制索引的人都是正确的。 是的,我写的问题很愚蠢,而且有问题。谢谢你纠正我。

你真的需要这个吗!=或者它是注定的=

这将选择两个表的近似笛卡尔积。我猜大概有6000万排

编辑:来自评论

是的以匹配tbl_rls.id 这些不在tblc\u评论\u经理中

我认为如果你想使用外部连接方法,这就是你需要的

 select `r`.`id` as `id` from `tbl_rls` as `r` 
  left join `tblc_comment_manager` as `cm` 
on  `cm`.`rlsc_id`!=`r`.`id
虽然我的偏好通常是

 select DISTINCT `r`.`id` as `id` from `tbl_rls` as `r` 
  left join `tblc_comment_manager` as `cm` 
on  `cm`.`rlsc_id`=`r`.`id
WHERE `cm`.`rlsc_id` IS NULL

您想选择什么

如果要查找其他表中没有匹配记录的tbl_rls记录,请使用此查询

 select `r`.`id` as `id` 
 from `tbl_rls`
 as `r` 
 WHERE NOT EXISTS(
          SELECT * FROM `tblc_comment_manager` as `cm` 
          WHERE  `cm`.`rlsc_id`=`r`.`id)

还可以考虑为表编制索引。我们正在一个100多万记录表上运行多个左联接,返回结果所需时间不超过一两秒。

看起来您需要的是tblc\u comment\u manager表中没有的r.id值

使用一个不在

选择r.id作为id 来自tbl_rls as r
如果r.id不在,请从tblc_comment_manager中选择不同的cm.rlsc_id作为cm

MySQL可能会帮助您了解发生了什么。

您可能需要提供更多信息。但我想尝试的一件事是颠倒ON条款的顺序,因为这很容易:

在r.id上!=cm.rlsc_id

编辑:您应该在PK id列上放置索引

但是我想

基本上,它说NOT IN比LEFT JOIN占用更少的资源。那篇文章中的一位评论员提到使用notexists是最好的


此外,我不确定这是否准确,但是。

是的!=要匹配tbl_rls.id,这些不在tblc_comment_manager中,是否有索引?如果是,在哪些列上?两个id列都应具有indexes@JohnB对于SQL Server,“NOT IN”和“NOT EXISTS”更为有效,但必须注意第一个为null。对于MySQL,我不确定建议是什么。此外,其他人指出了方法:cm.rlsc_id在哪里NULL@Martin:阅读高性能MySQL的人可能知道答案——但无论如何,他有几个选项需要5分钟才能测试。阿舍普,请公布你的结果@马丁:当你在MySQL中把一列设为PK时,它会自动为该列创建索引吗?如果没有,请为您的PK列Arsheep创建索引!该死的,这就是罪魁祸首。我用了10分钟到0.9毫秒。有没有关于MySQL分析工具的建议可以告诉你应该在你的数据库上有哪些索引?索引成功了。现在运行在233ms中的查询以前是48st这感觉应该是一个注释
 select `r`.`id` as `id` 
 from `tbl_rls`
 as `r` 
 WHERE NOT EXISTS(
          SELECT * FROM `tblc_comment_manager` as `cm` 
          WHERE  `cm`.`rlsc_id`=`r`.`id)
select `r`.`id`
from `tbl_rls` as `r` 
left join `tblc_comment_manager` as `cm` 
    on  `cm`.`rlsc_id`=`r`.`id
where `cm`.`rlsc_id` IS NULL