2013-10-14 4 views
0

У меня возникли трудности с оптимизацией этого запроса. То, что я пытаюсь достичь, состоит в том, чтобы объединить около 8 таблиц, из которых только около 3 таблиц содержат большие данные (1,5 м записей). Этот запрос возвращает ожидаемые записи, но занимает 1 мин для запуска, что плохо. Я знаю, что он может быть оптимизирован для выполнения гораздо лучше, PLS мне нужна помощь от вас экспертов. У меня есть индекс для полей, используемых для соединения.медленный запрос с объединениями

SELECT topic_id, 
    topic_title, 
    unit_name_abbrev, 
    sch_name_abbrev, 
    picture_small_url AS thumbnail, 
    profile_pix_upload_path, 
    first_name, 
    last_name, 
    topic_poster, 
    topic_replies, 
    topic_views, 
    topic_last_post_time AS topic_post_time, 
    sch_sub_forum_id 
FROM (_sch_forum_topics 
    INNER JOIN _users 
      ON (_users.userid = _sch_forum_topics.topic_poster) 
    INNER JOIN _profile 
      ON _profile.userid = _users.userid 
    INNER JOIN _class 
      ON _users.classid = _class.classid 
    INNER JOIN _level 
      ON _class.level_id = _level.id 
    INNER JOIN _unit 
      ON _class.unitid = _unit.unitid 
    INNER JOIN _department 
      ON _unit.deptid = _department.deptid 
    INNER JOIN _faculty 
      ON _department.facid = _faculty.facid 
    INNER JOIN _university 
      ON _faculty.schid = _university.schid) 
WHERE _sch_forum_topics.sch_sub_forum_id = 4 
ORDER BY _sch_forum_topics.topic_last_post_time DESC 
LIMIT 0, 15 
+1

Попробуйте переместить свои внутренние соединения снаружи на свой аргумент where и проверить свои индексы. Кроме того, что показывает «EXPLAIN» в запросе? – bear

+3

Опубликовать вывод EXPLAIN наиболее похоже на то, что у него есть много записей для анализа и запросов, наиболее вероятно, что им нужно «Использовать временные файлы, используя filesort;» потому что оптимизатор MySQL основан на стоимости, поэтому он наиболее правдоподобно обращается к неправильному порядку таблицы. –

+0

Удалите предложение order by и посмотрите, хорошо ли это, если да, разместите индекс по столбцам в порядке по предложению –

ответ

0

Попробуйте фильтровать перед тем, как сделать JOIN.

SELECT topic_id, 
    topic_title, 
    unit_name_abbrev, 
    sch_name_abbrev, 
    picture_small_url AS thumbnail, 
    profile_pix_upload_path, 
    first_name, 
    last_name, 
    topic_poster, 
    topic_replies, 
    topic_views, 
    topic_last_post_time AS topic_post_time, 
    sch_sub_forum_id 
FROM 
(select * FROM sch_forum_topics WHERE sch_sub_forum_id = 4 
ORDER BY topic_last_post_time DESC 
LIMIT 0, 15) main 
    INNER JOIN _users 
      ON (_users.userid = main.topic_poster) 
    INNER JOIN _profile 
      ON _profile.userid = _users.userid 
    INNER JOIN _class 
      ON _users.classid = _class.classid 
    INNER JOIN _level 
      ON _class.level_id = _level.id 
    INNER JOIN _unit 
      ON _class.unitid = _unit.unitid 
    INNER JOIN _department 
      ON _unit.deptid = _department.deptid 
    INNER JOIN _faculty 
      ON _department.facid = _faculty.facid 
    INNER JOIN _university 
      ON _faculty.schid = _university.schid); 
+1

этот вопрос не эквивалентен оригинальному. – Sebas

+0

Исправлена ​​фильтрация, спасибо. – Ashalynd

+0

Я считаю, что предел, который вы применяете до присоединения, не то же самое, что и после этого. – Sebas

Смежные вопросы