使用Left Join的Mysql查询太慢了

时间:2010-07-15 16:13:34

标签: sql mysql join query-optimization

查询:

   select `r`.`id` as `id` 
     from `tbl_rls` as `r` 
left join `tblc_comment_manager` as `cm` on `cm`.`rlsc_id` != `r`.`id`

这两个表都有8k记录,但为什么它很慢,有时需要2-3分钟?

OMG,这个查询使mysql服务器失效。将在一秒钟内回复你们:(

所有建议索引列的人都是正确的。 是的,我写的查询很愚蠢。谢谢你纠正我。

6 个答案:

答案 0 :(得分:21)

还要考虑索引表格。我们在1百万+记录表上运行多个左连接,返回结果的时间不会超过一两秒。

答案 1 :(得分:13)

您真的需要!=还是意味着=

 select `r`.`id` as `id` from `tbl_rls` as `r` 
  left join `tblc_comment_manager` as `cm` 
on  `cm`.`rlsc_id`!=`r`.`id

这将选择几乎两个表的笛卡尔积。 (我估计大约有6000万行)

编辑:从评论中

  

是的,匹配tbl_rls.id是“!=”   那些不在tblc_comment_manager

我认为如果您想使用outer join方法,这就是您所需要的。

 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

虽然我的偏好通常是

 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)

答案 2 :(得分:4)

您想选择什么?

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

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

答案 3 :(得分:2)

MySQL的EXPLAIN可能会帮助您了解正在发生的事情。

答案 4 :(得分:2)

您可能需要提供更多信息。但我要尝试的一件事是颠倒你的ON子句的顺序(因为它很容易):

ON r.id != cm.rlsc_id

编辑:你应该在你的PK(id)列上放置索引。

但我认为this article might help you out

基本上它表示NOT IN占用的资源少于LEFT JOIN。该文章中的评论者提到使用NOT EXISTS是最好的。

此外,我不确定这是否准确,但this article says that NOT IN does a full table scan, and NOT EXISTS can use an index

答案 5 :(得分:1)

看起来你想要的是不在tblc_comment_manager表中的r.id值。

使用不在

选择ridid
     来自tbl_rls作为r
其中rid不在(从cm选择rlsc_id tblc_comment_manager cm