Вчера я обнаружил медленный запрос работает на сервере (этот запрос стоит больше, чем на 1 минуту) .Это выглядит следующим образом:Почему этот запрос так медленно работает с MySQL?
select a.* from a
left join b on a.hotel_id=b.hotel_id and a.hotel_type=b.hotel_type
where b.hotel_id is null
Есть 40000+ строка в таблице а и 10000+ строки в таблице б. Уникальный ключ уже был создан на столбцах hotel_id и hotel_type в таблице b, например UNIQUE KEY idx_hotel_id
(hotel_id
, hotel_type
). Так что я использовал ключевое слово для объяснения, чтобы проверить план запроса на этом sql, и я получил результат, похожий на следующий:
type key rows
1 SIMPLE a ALL NULL NULL NULL NULL 36804
1 SIMPLE b index NULL idx_hotel_id 185 NULL 8353 Using where; Using index; Not exists
Согласно справочному руководству MySQL, wh en все части индекса используются соединением, а индекс - это индекс PRIMARY KEY или UNIQUE NOT NULL, тип соединения будет «eq_ref». Посмотрите на вторую строку плана запроса, значение типа столбца - «индекс», . Но у меня действительно был уникальный индекс для hotel_id и hotel_type, и оба этих столбца были использованы соединением. Тип соединения «ef_ref» более эффективен, чем тип соединения «ref» и «ref» более эффективен, чем «диапазон», «index» - это последний тип соединения wo wanna hava, кроме «ALL». Это то, о чем я запутался, и я хочу знать, почему тип соединения здесь «index». Надеюсь, я опишу свой вопрос, и я с нетерпением жду ответа от вас, ребята, спасибо!
измените свой выбор. * выберите a.hotel_id, a.hotel_type и скоро. select * не только возвращают данные, но и больше. – errorare
@errorare То, что возвращается, не должно влиять на то, как соединение выполняется. – Barmar
См. Здесь [ссылка] (http://stackoverflow.com/a/3639964/1572987) – errorare