使用左连接的Mysql查询速度太慢
查询: 两个表都有8k记录,但为什么速度很慢,有时需要2-3分钟甚至更长时间 天哪,这个查询使mysql服务器停机。将在一秒钟内返回给你们: 所有建议为这些列编制索引的人都是正确的。 是的,我写的问题很愚蠢,而且有问题。谢谢你纠正我。你真的需要这个吗!=或者它是注定的= 这将选择两个表的近似笛卡尔积。我猜大概有6000万排 编辑:来自评论 是的以匹配tbl_rls.id 这些不在tblc\u评论\u经理中 我认为如果你想使用外部连接方法,这就是你需要的使用左连接的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 `
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作为cmMySQL可能会帮助您了解发生了什么。您可能需要提供更多信息。但我想尝试的一件事是颠倒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