SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.06.2022 00:55:28

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

"Правильный" запрос работает медленнее "неправильного"!?

Имеем запрос, в котором выбираем пользователей и одновременно из другой таблицы подтягиваем некоторые другие данные по каждому пользователю.
"Правильный" код предполагает использование LEFT JOIN и запрос выглядит следующим образом:

SELECT u.id, u.name, u.state, e.data1, e.data2, e.data3
FROM users AS u
LEFT JOIN extdata AS e ON e.user_id = u.id
WHERE u.state = 1


Переписываем этот запрос без использования LEFT JOIN:

SELECT u.id, u.name, u.state,
      (SELECT e.data1 FROM extdata AS e WHERE e.user_id = u.id) AS data1,
      (SELECT e.data2 FROM extdata AS e WHERE e.user_id = u.id) AS data2,
      (SELECT e.data3 FROM extdata AS e WHERE e.user_id = u.id) AS data3
FROM users AS u
WHERE u.state = 1


Второй запрос работает значительно быстрее первого!yikes

На базе в 50 тысяч пользователей второй тип намного более "навороченного" запроса (дополнительная выборка нескольких полей из 5 внешних таблиц) отрабатывает в 3 (!) раза быстрее чем "правильный" запрос с JOIN`ами!

MySQL 5.7.36

С чем это может быть связано и почему все руководства рекомендуют использовать LEFT JOIN, а использование встроенных селектов считается чуть ли не признаком дурного тона?

Неактивен

 

#2 14.06.2022 02:23:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: "Правильный" запрос работает медленнее "неправильного"!?

Это не равнозначные в общем случае запросы. Работать будет только если u.id соответствует не более одного e.user_id.

Второй запрос работает значительно быстрее первого!

Это о приведенном примере или все-таки про намного более "навороченный" запрос?
Во втором случае, скорее всего, какое-нибудь исключение, типа, выбор не оптимального порядка соединения таблиц оптимизатором.

Неактивен

 

#3 14.06.2022 03:22:46

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Re: "Правильный" запрос работает медленнее "неправильного"!?

Да, естественно, речь идет только о связи "один к одному".
Хотя второй запрос в этом плане универсален - если связанных записей больше одной, то легко можно выбрать одну нужную (по любому критерию). Попробуйте сделать что-то подобное с INNER!

Работает быстрее для запроса любой сложности - проверял на выборках от одной до 5 связанных таблиц - больше просто в этой базе нет. Чем больше выборок из связанных таблиц, тем больше разница в скорости выполнения запросов.

Что до оптимизатора сервера - я предпочитаю его не трогать - рабочий сайт я не контролирую. И если получаю выигрыш в скорости - какая мне разница, как работает этот оптимизатор!

Если я правильно понял - Вы хотите сказать, что при "правильных" настройках сервера и "правильной" структуре базы и взаимосвязей таблиц разница в скорости выполнения запросов обоих типов будет незначительная? Или INNER будет быстрее?

Неактивен

 

#4 14.06.2022 09:59:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: "Правильный" запрос работает медленнее "неправильного"!?

Поведение кажется странным. Приведите, пожалуйста, результат SHOW CREATE TABLE для таблиц и EXPLAIN обоих запросов.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson