MySQL GROUP BY оптимизация - PullRequest
       5

MySQL GROUP BY оптимизация

0 голосов
/ 31 марта 2011

Может кто-нибудь сказать мне, как я могу ускорить MySQL группы по предложению? Я прочитал документацию, но она не дает хороших примеров.

UPDATE SQL
SELECT
  post.topic_id,
  topic.topic_posts,
  topic.topic_title,
  topic.topic_poster_name,
  topic.topic_last_post_id,
  forum.forum_name AS group_name,
  `group`.slug AS child_slug,
  `parent`.slug AS parent_slug
FROM bb_posts post
LEFT JOIN bb_topics topic
  ON topic.topic_id = post.topic_id
LEFT JOIN bb_forums forum
  ON forum.forum_id = topic.forum_id
LEFT JOIN wp_bp_groups `group`
  ON topic.forum_id = `group`.id
LEFT JOIN wp_bp_groups `parent`
  ON `group`.parent_id = `parent`.id
WHERE (topic_title LIKE '%$search_terms%' || MATCH(post.post_text) AGAINST('$search_terms'))
   && topic_status = 0
GROUP BY topic_id
ORDER BY topic.topic_start_time DESC
LIMIT $offset,$num

Ответы [ 3 ]

0 голосов
/ 31 марта 2011

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

Группировка по выполняется быстрее всего, если у вас есть индекс для столбца, по которому производится группировка, и:

  • Запрос по одной таблице.
  • GROUP BY называет только столбцы, которые образуют крайний левый префикс индекса, но не другие столбцы. (Если вместо GROUP BY в запросе есть предложение DISTINCT, все отдельные атрибуты ссылаются на столбцы, которые образуют крайний левый префикс индекса.) Например, если таблица t1 имеет индекс на (c1, c2, c3), Свободное сканирование индекса применимо, если запрос имеет GROUP BY c1, c2 ,. Это не применимо, если запрос имеет GROUP BY c2, c3 (столбцы не являются крайним левым префиксом) или GROUP BY c1, c2, c4 (c4 отсутствует в индексе).
  • Единственными агрегатными функциями, используемыми в списке выбора (если они есть), являются MIN () и MAX (), и все они ссылаются на один и тот же столбец. Столбец должен быть в индексе и должен следовать за столбцами в GROUP BY.
  • Любые другие части индекса, кроме тех, которые указаны в запросе GROUP BY, на которые есть ссылка в запросе, должны быть константами (то есть на них должны ссылаться равенства в константах), за исключением аргумента функций MIN () или MAX ().
  • Для столбцов в индексе должны быть проиндексированы полные значения столбцов, а не просто префикс. Например, при использовании c1 VARCHAR (20), INDEX (c1 (10)) индекс нельзя использовать для произвольного сканирования индекса.
0 голосов
/ 31 марта 2011

Включите условие where в часть условий соединения.

0 голосов
/ 31 марта 2011

Общая рекомендация заключается в том, чтобы убедиться, что поле, по которому вы группируете, имеет индекс.

Самый общий способ выполнения предложения GROUP BY - это сканирование всей таблицы и создание новой временной таблицы, в которой все строки из каждой группы являются последовательными, а затем использование этой временной таблицы для обнаружения групп и применения агрегата.функции (если есть).В некоторых случаях MySQL может работать намного лучше и избегать создания временных таблиц с помощью доступа к индексу.

  • Убедитесь, что у каждого внешнего ключа есть соответствующий индекс.
  • Создание индексов покрытия в полях, которые вы извлекаете
  • Создание индекса в поле, которое вы сортируете, не повредит.
...