Долгое выполнение запроса выборки

InstantCMS 2.X

Запрос с Join выполняется медленно

#1 6 мая 2023 в 09:06

Всем привет.

Есть несколько таблиц. При выборке присоединяются Join'ами, все работало отлично и быстро пока в таблицах было мало записей. Сейчас когда в таблицах 5млн. записей выборка (в частности COUNT) выполняется секунд 10. (индексы все проставлены).

Вопрос! Если при малом количестве записей все работало быстро, а при большом медленно возможно ли проблема в сервере? Не хватает мощностей или проблема так же может быть в замом составленном запросе?

#2 6 мая 2023 в 10:23

индексы все проставлены

Narochnyi

Это хорошо. Но только explain запроса покажет какие из них используются и используются ли вообще, а также какое количество строк участвует в запросе. Так как если в основной таблице есть 5 млн записей, то джоины могут их увеличить многократно и тогда подсчёт уже будет реально занимать длительное время. А в целом железо сервера влияет на скорость обработки запросов. Добавить оперативки и солидных жестких дисков будет только плюсом. Но на шаред хостингах 5млн записей за 10-12 сек это круто.

#3 25 февраля 2024 в 00:15
  1. SELECT i.id, i.nameRu,
  2. GROUP_CONCAT(DISTINCT g.title ORDER BY g.title SEPARATOR ', ') AS genres,
  3. GROUP_CONCAT(DISTINCT c.title ORDER BY c.title SEPARATOR ', ') AS countries
  4. FROM cms_movies i
  5. LEFT JOIN cms_genres_bind AS gb ON gb.kid = i.id
  6. LEFT JOIN cms_genres AS g ON gb.gid = g.id
  7. LEFT JOIN cms_countries_bind AS cb ON cb.kid = i.id
  8. LEFT JOIN cms_countries AS c ON cb.cid = c.id
  9. GROUP BY i.id
  10. ORDER BY i.id
  11. LIMIT 0, 10

В данном запросе, если сортировать по полю ID или убрать ORDER BY вообще, то запрос выполняется за 0.0090 сек.

Если выполнять сортировку по полю year, у которого проставлен индекс, то выполнение занимает 3.1150 сек.

Как можно решить данную проблему? EXPLAIN прикладываю

Изображение
Изображение
Добавлено спустя 1 час

Решил проблему так:

  1. SELECT i.id, i.nameRu,
  2. (SELECT group_concat(g.title ORDER BY g.title ASC separator ', ' ) FROM cms_genres_bind gb JOIN cms_genres g ON gb.gid = g.id WHERE gb.kid = i.id) AS genres,
  3. (SELECT group_concat(c.title ORDER BY c.title ASC separator ', ' ) FROM cms_countries_bind cb JOIN cms_countries c ON cb.cid = c.id WHERE cb.kid = i.id) AS countries,
  4. FROM cms_movies i
  5. ORDER BY i.year DESC
  6. LIMIT 0, 15
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.