@Kulay

Как максимально оптимизировать связь двух таблиц через третью?

Суть: есть табличка с заявками, табличка с источниками и связующая табличка, у заявок может быть множество источников, но в данном случае объединять нужно заявку только с первым источником.
Набросал демку - sqlfiddle.com/#!9/53d445/1
Запрос из демки хорошо работает, когда данных мало, но когда нужно обработать миллионы строк, то запрос выполняется очень долго.
Вопрос: каким образом можно оптимизировать данный запрос?
UPD: к запросу будут применяться дополнительные фильтры (по дате, источнику, прочим данным)
UPD2: в выборке чаще всего будет count по общему числу строк
  • Вопрос задан
  • 274 просмотра
Решения вопроса 1
@Kulay Автор вопроса
В итоге подобный запрос выполняется быстрее всего sqlfiddle.com/#!9/53d445/14
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
rpsv
@rpsv
делай либо хорошо, либо никак
Индексы создать?
Или хотя бы разметить столбцы как внешние ключи.

Как вариант можно попробовать сменить основную таблицу:
SELECT
r.id as req,
ss.id as ss_id,
ss.user_id as user,
min(ss.created_at) AS date
FROM seo_source AS ss
INNER JOIN seo_user_request AS su ON su.user_id = ss.user_id
INNER JOIN request as r ON r.id = su.request_id
GROUP BY ss.id
Ответ написан
pezdatskiy
@pezdatskiy
Предприниматель, по выходным- программист
Я вижу это так- select нужно выполнять к таблице seo_source с теми же group и sort, inner join к юзеру, left join к request.
У вас два запроса в одном- а так один. Будет работать быстрее.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Попробуйте так:
select `r`.`id` as `req`, `ss`.`user_id` as `user`, `ss`.`created_at` as `date`
  from (
    select `user_id`, min(`created_at`) as `min_date` 
      from `seo_source` 
      group by `user_id`
  ) as ss
  right join `seo_user_request` as `su` on `su`.`user_id` = `ss`.`user_id`
  left join `request` as `r` on `r`.`id` = `su`.`request_id`

Выборка `ss`.`id` не имеет смысла, поскольку при группировке будет взято значение из произвольной строки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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