Эффективно ли использовать множественное левое соединение в mysql? - PullRequest
0 голосов
/ 03 мая 2020
SELECT b.*, a.deal_id, 
       CONCAT(c.first_name, ' ', c.last_name) AS buyer_name, 
       CONCAT(d.first_name, ' ', d.last_name) AS seller_name, 
       a.payment_method, a.added_delivery, a.item_to_buy_type, a.item_to_buy_description 
FROM prepay_main_staging.pp_dispute b LEFT JOIN 
     pp_deal a 
     ON a.id = b.id_deal LEFT JOIN 
     pp_user c 
     ON c.id = b.id_buyer LEFT JOIN 
     pp_user d 
     ON d.id = b.id_seller 
WHERE b.id_seller = '9' OR b.id_buyer = '9';

Это достаточно эффективно? Я попробовал это только для того, чтобы получить 2 строки из БД, а продолжительность составила 0.344se c. (mysql верстак)

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Проблема с вашим запросом не LEFT JOIN. Это сравнение WHERE. Есть две проблемы:

  1. OR.
  2. Идентификаторы, предположительно, числа, а не строки. Не смешивайте типы.

Начните с этого "половинного" запроса:

SELECT dis.*, d.deal_id,
       CONCAT(ub.first_name, ' ', ub.last_name) AS buyer_name,
       CONCAT(us.first_name, ' ', us.last_name) AS seller_name,
       d.payment_method, d.added_delivery, d.item_to_buy_type, 
       d.item_to_buy_description 
FROM prepay_main_staging.pp_dispute dis JOIN
     pp_deal d
     ON d.id = dis.id_deal JOIN
     pp_user ub
     ON ub.id = dis.id_buyer JOIN
     pp_user us
     ON us.id = dis.id_seller 
WHERE dis.id_seller = 9;

Сначала обратите внимание, что я изменил псевдонимы таблиц на что-то осмысленное - сокращения таблиц. Теперь выполнить запрос намного проще.

Я также изменил JOIN s на внутренние соединения и исправил сравнение.

Для этого запроса вы хотите индексировать один:

  • pp_dispute(id_seller, id_deal, id_buyer)

Я предполагаю, что id в другой таблице уже объявлены как первичные ключи.

Посмотрите, как быстро это работает. Если он работает быстро, напишите тот же запрос для id_buyer и используйте UNION ALL для их объединения. MySQL в частности - и базы данных в целом - плохо справляются с оптимизацией OR условий.

Следует отметить, что вы можете заменить JOIN s на LEFT JOIN s и вы ' Посмотрим, что не изменит производительность в этой версии. Однако, LEFT JOIN, вероятно, не является логически правильным.

1 голос
/ 03 мая 2020

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

 table pp_dispute composite index on  (id_deal,id_buyer, id_seller )

, но ваше предложение объединения всегда совпадает тогда используйте INNER JOIN .. для работы с более маленьким набором результатов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...