результат запроса занимает время для загрузки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть запрос, который выбирает данные из шести таблиц, но для извлечения данных требуется слишком много времени. Браузер загружает и иногда ничего не показывает в результате. Когда я выполняю этот запрос в базе данных MySQL, он занимает много времени, чтобы выполнить.

SELECT SQL_CALC_FOUND_ROWS movies.*,
curriculums.name AS curriculum,
teachers.name AS teacher,
movie_sub_categories.name AS sub_cat_name,
movie_categories.name AS cat_name
FROM movies
LEFT JOIN curriculums on movies.curriculum_id = curriculums.id
LEFT JOIN teachers on movies.teacher_id = teachers.id
LEFT JOIN movies_movie_sub_categories on movies.id = movies_movie_sub_categories.movie_id
LEFT JOIN movie_sub_categories on movies_movie_sub_categories.movie_sub_category_id = movie_sub_categories.id
LEFT JOIN movie_categories on movie_sub_categories.movie_category_id = movie_categories.id
ORDER BY id LIMIT 0, 50

Здесь вся моя структура таблицы enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Это не очень интересный запрос - он просто доставляет первые 50 строк таблицы, к которой принадлежит id. Когда JOINing, , пожалуйста, уточните столбцы, чтобы мы знали, что происходит.

Вам действительно нужно LEFT?

Если вам нужно LEFT и id принадлежит movies, то это должно работать намного быстрее:

Между тем, найдите, сколько строк в movies только один раз, так что вам не придется каждый раз вычислять его.

SELECT  movies.*, curriculums.name AS curriculum,
        teachers.name AS teacher, movie_sub_categories.name AS sub_cat_name,
        movie_categories.name AS cat_name
    FROM  ( SELECT id FROM movies ORDER BY id LIMIT 0, 50 ) AS m
    JOIN  movies USING(id)
    LEFT JOIN  curriculums AS c  ON movies.curriculum_id = c.id
    LEFT JOIN  teachers AS t  ON movies.teacher_id = t.id
    LEFT JOIN  movies_movie_sub_categories AS mmsc  ON movies.id = mmsc.movie_id
    LEFT JOIN  movie_sub_categories AS msc  ON mmsc.movie_sub_category_id = msc.id
    LEFT JOIN  movie_categories AS mc  ON msc.movie_category_id = mc.id
    ORDER BY  m.id 

Пожалуйста, используйте SHOW CREATE TABLE; нам нужно проверить, достаточно ли у вас индексов, таких как

mmsc:  INDEX(movie_id)
0 голосов
/ 08 мая 2018

таблица movies_movie_sub_categories должна иметь индекс для movie_id и отдельный индекс для movie_sub_category_id. Без этих двух индексов сборщик запросов будет вынужден сканировать каждую запись дважды (поскольку запрос имеет два отдельных предложения соединения, которые ссылаются на эту таблицу)

...