Очень долго выполняется запрос MySQL

77
16 марта 2022, 20:20

Очень долго выполняется запрос. Если я использую только один параметр, то все быстро. Но когда использую OR: mi.interest_id IN ('$interest_values') OR mt.tag_id IN ('$tag_values') то долго.

В таблице members_tags около милиона записей.

Поиск должен выдавать всех members по указаным интересам и тагам.

SELECT DISTINCT m.email_address 
FROM members m 
LEFT JOIN members_tags mt ON mt.member_id = m.member_id 
LEFT JOIN members_interests mi ON mi.member_id = m.member_id 
WHERE mi.interest_id IN ('$interest_values') OR mt.tag_id IN ('$tag_values')
Answer 1

поскольку таблицы (по крайней мере одна) довольно большие, то не надо их лефт-джойнить друг на дурга, а потом фильтровать. Данный запрос можно эквивалентно разбить на два, используя unionи inner join:

 SELECT DISTINCT m.email_address
 FROM members AS m
 INNER JOIN members_tags AS mt ON (
        mt.member_id = m.id 
        AND mt.tag_id IN (....))
 UNION
 SELECT DISTINCT m.email_address
 FROM members AS m
 INNER JOIN members_interests AS mi ON (
        mi.member_id = m.id 
        AND mi.interest_id IN (....))

при этом в этих таблицах связи многие ко многим на полях member_id, tag_id необходимо добавить индекс.

Возможно также джойнить не сами таблицы связи а distinct-выборку из них, например

 SELECT m.email_address
 FROM members AS m
 INNER JOIN (
      SELECT DISTINCT member_id 
      FROM members_tags AS mt 
      WHERE mt.tag_id IN (....)
      UNION ... 
   ) as x on x.member_id = m.id

и еще потенциально, в таблице members можно сделать индекс, включающий id и email_address

READ ALSO
как пользоваться assert php

как пользоваться assert php

Не понимаю как это работает,

76
сравнение двух date objects

сравнение двух date objects

У меня есть два input type date, где выставлена сегодняшняя дата и завтрашняя

92
FocusOut vs Click

FocusOut vs Click

У меня на форме есть ввод города

66
AJAX добавляю обычный комментарий в код и ничего не работает

AJAX добавляю обычный комментарий в код и ничего не работает

Я не совсем понимаю как такое возможноучусь делать отправку формы через php обработчик, чтобы страница не перезагружалась использую ajax пока...

268