查询:
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服务器失效。将在一秒钟内回复你们:(所有建议索引列的人都是正确的。 是的,我写的查询很愚蠢。谢谢你纠正我。
答案 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值。
使用不在
选择r
。id
为id
来自tbl_rls
作为r
其中r
。id
不在(从cm
选择rlsc_id
tblc_comment_manager
cm