簡體   English   中英

MySQL GROUP BY優化

[英]MySQL GROUP BY optimisation

誰能告訴我如何加快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

一般的最佳做法是確保您要分組的字段具有索引。

滿足GROUP BY子句的最通用方法是掃描整個表並創建一個新的臨時表,其中每個組中的所有行都是連續的,然后使用該臨時表發現組並應用聚合函數(如果有)。 在某些情況下,MySQL可以做得更好,並且可以避免使用索引訪問來創建臨時表。

  • 確保每個外鍵都有對應的索引。
  • 在您檢索的字段上創建覆蓋索引
  • 在要排序的字段上創建索引也不會受到損害。

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

當分組的列上有索引時,Group by最快,並且:

  • 查詢是在單個表上。
  • 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)),索引不能用於松散索引掃描。

使where子句成為連接條件的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM