views:

72

answers:

6

Query:

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

Both tables has 8k records but why it is too very slow taking 2-3 minutes and more sometime.

OMG , this query makes mysql server down. Will get back to you peoples in a second :(

All peoples those suggested Indexing the columns are all Correct. Yeh the query i wrote was silly and buggy. Thanks correcting me.

+8  A: 

Do you really need the != or is it meant to be =?

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

This will select nearly the cartesian product of the 2 tables. (I guess around 60 million rows)

Edit: From the comment

yes it is " != " to match tbl_rls.id those are not in tblc_comment_manager

I think this is what you need if you want to use the outer join approach.

 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

Although my preference is usually

 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)
Martin Smith
yes it is " != " to match `tbl_rls`.`id` those are not in `tblc_comment_manager`
Arsheep
+1 for fixing mine query
Arsheep
+3  A: 

What do you want to select?

Use this query if you want to find tbl_rls records that haven't matching records in other table

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
Naktibalda
+1: You beat me, by 25 seconds...
OMG Ponies
+1  A: 

Consider also indexing your tables. We're running multiple left joins on a 1million+ record table that doesn't take more than a second or two to return results.

bpeterson76
+1  A: 

Looks like you are wanting the r.id values that are not in the tblc_comment_manager table.

Use a Not In

select r.id as id
from tbl_rls as r
where r.id not in (select distinct cm.rlsc_id from tblc_comment_manager as cm)

DaveWilliamson
A: 

MySQL's EXPLAIN might help you finding out what is going on.

middus
+2  A: 

You may need to provide more info. But one thing I would try is reversing the order of your ON clause (because it's so easy):

ON r.id != cm.rlsc_id

Edit: and you should put indexes on your PK (id) columns.

But I think this article might help you out.

Basically it says that NOT IN takes less resources than LEFT JOIN. A commenter in that article mentions using NOT EXISTS is best.

Also, I'm not sure this is accurate or not, but this article says that NOT IN does a full table scan, and NOT EXISTS can use an index.

JohnB
@JohnB For SQL Server 'NOT IN' and `NOT EXISTS` are more efficient (though care must be taken about NULLs for the first one). For MySQL I'm not sure what the recommendation is.
Martin Smith
Additionally, others have pointed out the approach: `WHERE cm.rlsc_id IS NULL`
JohnB
@Martin: someone who read **High Performance MySQL** might know the answer - http://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064
JohnB
Neverthess, he has a few options that would take him 5 mins to test. Arsheep, please post your results!
JohnB
@Martin: when you make a column a PK in MySQL, does it automatically create an index for that column? If not, create indexes for your PK columns Arsheep!
JohnB
@JohnB - Yep quick test this end seems to say that you'll automagically get an index on the PK but I guess that might not help `tblc_comment_manager`
Martin Smith
@Martin Smith: Depends on if the columns are [nullable](http://explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exists-nullable-columns/) or [not](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)
OMG Ponies
@OMG - Good find, thanks. I'll have a read of those now.
Martin Smith