Запрос:
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 сервер. Возвратит Вам народы через секунду :(
Все народы предложенные Индексацию столбцов все Корректны. Yeh запрос, который я записал, был глуп и ошибочен. Спасибо, исправляющее меня.
Подумайте также об индексации ваших таблиц. Мы запускаем несколько левых объединений в таблице с более чем миллионом записей, и для возврата результатов требуется не более секунды или двух.
Что вы хотите выбрать?
Используйте этот запрос, если вы хотите найти записи 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
Вам действительно нужен ! =
или он должен быть =
?
select `r`.`id` as `id` from `tbl_rls` as `r`
left join `tblc_comment_manager` as `cm`
on `cm`.`rlsc_id`!=`r`.`id
Это позволит выбрать почти декартово произведение двух таблиц. (Я думаю, около 60 миллионов строк)
Изменить: Из комментария
да, это "! =" Для соответствия tbl_rls.id их нет в tblc_comment_manager
Я думаю, это то, что вам нужно, если вы хотите использовать подход external 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)
Похоже, вам нужны значения r.id, которых нет в таблице tblc_comment_manager.
Использовать «Не в»
выберите r
. id
как id
из tbl_rls
как r
, где r
. id
не в (выберите отдельный см
. rlsc_id
из tblc_comment_manager
как см
)
MySQL EXPLAIN может помочь вам узнать, что происходит.
Возможно, вам потребуется дополнительная информация. Но я бы попробовал изменить порядок вашего предложения ON (потому что это так просто):
ON r.id! = Cm.rlsc_id
Edit: и вы должны поместить индексы в столбцы PK (id) .
Но я думаю эта статья может вам помочь .
В основном это говорит о том, что NOT IN
требует меньше ресурсов, чем LEFT JOIN
. Комментатор в этой статье упоминает, что лучше всего использовать NOT EXISTS
.
Кроме того, я не уверен, что это правильно или нет, но в этой статье говорится, что NOT IN
выполняет полное сканирование таблицы, а NOT EXISTS
может использовать индекс .