MySQL GROUP BY优化

时间:2011-03-31 18:59:45

标签: php mysql lamp

谁能告诉我如何加速mysql group by子句?我已阅读文档,但它没有给出任何好的例子。

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 :(得分:0)

一般的最佳做法是确保您分组的字段具有索引。

  

最满意的一种方式   GROUP BY子句是扫描整个   表并创建一个新的临时表   其中每组的所有行都是   连续,然后使用此   临时表来发现组和   应用聚合函数(如果有的话)。在   在某些情况下,MySQL能够做很多事情   比这更好,并避免创造   使用索引的临时表   访问。

  • 确保每个外键都有相应的索引。
  • 在您检索的字段上创建覆盖索引
  • 在您要对bij进行排序的字段上创建索引也不会受到影响。

答案 1 :(得分:0)

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

当您对要分组的列具有索引时,分组依据最快,并且:

  • 查询在一个表上。
  • GROUP BY只列出构成索引最左边前缀而不包含其他列的列。 (如果查询具有DISTINCT子句而不是GROUP BY,则所有不同的属性引用形成索引的最左前缀的列。)例如,如果表t1具有(c1,c2,c3)上的索引,如果查询具有GROUP BY c1,c2,则松散索引扫描适用。如果查询具有GROUP BY c2,c3(列不是最左边的前缀)或GROUP BY c1,c2,c4(c4不在索引中),则不适用。
  • 选择列表中使用的唯一聚合函数(如果有)是MIN()和MAX(),并且它们都引用同一列。该列必须位于索引中,并且必须遵循GROUP BY中的列。
  • 除了MIN()或MAX()函数的参数之外,索引中除查询中引用的GROUP BY之外的任何其他部分必须是常量(即,它们必须以与常量相等的方式引用)。
  • 对于索引中的列,必须索引完整列值,而不仅仅是前缀。例如,对于c1 VARCHAR(20),INDEX(c1(10)),索引不能用于松散索引扫描。

答案 2 :(得分:0)

使你的where子句成为连接条件的一部分。