Запрос Mysql с Левым Соединением слишком очень медленен

Запрос:

   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 запрос, который я записал, был глуп и ошибочен. Спасибо, исправляющее меня.

8
задан John Fowler 3 November 2012 в 17:25
поделиться

6 ответов

Подумайте также об индексации ваших таблиц. Мы запускаем несколько левых объединений в таблице с более чем миллионом записей, и для возврата результатов требуется не более секунды или двух.

21
ответ дан 5 December 2019 в 04:43
поделиться

Что вы хотите выбрать?

Используйте этот запрос, если вы хотите найти записи 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
4
ответ дан 5 December 2019 в 04:43
поделиться

Вам действительно нужен ! = или он должен быть = ?

 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)
13
ответ дан 5 December 2019 в 04:43
поделиться

Похоже, вам нужны значения r.id, которых нет в таблице tblc_comment_manager.

Использовать «Не в»

выберите r . id как id
из tbl_rls как r
, где r . id не в (выберите отдельный см . rlsc_id из tblc_comment_manager как см )

1
ответ дан 5 December 2019 в 04:43
поделиться

MySQL EXPLAIN может помочь вам узнать, что происходит.

2
ответ дан 5 December 2019 в 04:43
поделиться

Возможно, вам потребуется дополнительная информация. Но я бы попробовал изменить порядок вашего предложения ON (потому что это так просто):

ON r.id! = Cm.rlsc_id

Edit: и вы должны поместить индексы в столбцы PK (id) .

Но я думаю эта статья может вам помочь .

В основном это говорит о том, что NOT IN требует меньше ресурсов, чем LEFT JOIN . Комментатор в этой статье упоминает, что лучше всего использовать NOT EXISTS .

Кроме того, я не уверен, что это правильно или нет, но в этой статье говорится, что NOT IN выполняет полное сканирование таблицы, а NOT EXISTS может использовать индекс .

2
ответ дан 5 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: