MySQL最佳化GROUP BY方案
執行GROUP BY子句的最一般的方法:先掃描整個表,然後建立一個新的臨時表,表中每個組的所有行應為連續的,最後使用該臨時表來找到組並應用聚集函式(如果有聚集函式)。在某些情況中,MySQL透過訪問索引就可以得到結果,而不用建立臨時表。此類查詢的 EXPLAIN 輸出顯示 Extra列的值為 Using index for group-by。
一。 鬆散索引掃描
1.滿足條件
查詢針對一個表。
GROUP BY 使用索引的最左字首。
只可以使用MIN()和MAX()聚集函式,並且它們均指向相同的列。
2.示例
表t1(c1,c2,c3,c4) 有一個索引 idx(c1,c2,c3):
?
12345678910111213 |
SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN (c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1
|
不滿足條件示例:
1. 除了MIN()或MAX(),還有其它累積函式,例如:
?
1 |
SELECT c1, SUM (c2) FROM t1 GROUP BY c1;
|
2. GROUP BY子句中的域不引用索引開頭,例如:
?
1 |
SELECT c1,c2 FROM t1 GROUP BY c2, c3;
|
3. 查詢引用了GROUP BY 部分後面的關鍵字的一部分,並且沒有等於常量的等式,例如:
?
1 |
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
|
二。緊湊索引掃描
如果不滿足鬆散索引掃描條件,執行GROUP BY仍然可以不用建立臨時表。如果WHERE子句中有範圍條件,該方法只讀取滿足這些條件的關鍵字。
否則,進行索引掃描。該方法讀取由WHERE子句定義的範圍。
1. GROUP BY 中有一個漏洞,但已經由條件c2 = 'a'覆蓋。
?
1 |
SELECT c1,c2,c3 FROM t1 WHERE c2 = 'a' GROUP BY c1,c3;
|
2. GROUP BY 不是滿足最左字首,但是有一個條件提供該元素的常量:
?
1 |
SELECT c1,c2,c3 FROM t1 WHERE c1 = 'a' GROUP BY c2,c3;
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2804395/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL大表最佳化方案MySql
- MySQL Group ReplicationMySql
- mysql group by 執行原理及千萬級別count 查詢最佳化MySql
- Mysql資料庫大表最佳化方案和Mysql大表最佳化步驟MySql資料庫
- 【Mysql】MySQL5.7.17- Group Replication搭建MySql
- MySQL 大表最佳化方案,收藏了細看!MySql
- MySQL group replication介紹MySql
- MySQL Group Replication小試MySql
- MySQL的Group By分組MySql
- mysql的order by和group byMySql
- MySQL查詢最佳化方案彙總(索引相關)MySql索引
- MySQL 之 only_full_group_byMySql
- MySQL/InnoDB和Group CommitMySqlMIT
- 最佳化方案
- MySQL錯誤-this is incompatible with sql_mode=only_full_group_by完美解決方案MySql
- group by排序,derived_merge最佳化的坑排序
- mysql group by 取想要的結果MySql
- MySQL Group Replication 學習(部署篇)MySql
- MySQL 預設 only_full_group_byMySql
- SQL最佳化方案SQL
- Mysql 最佳化MySql
- mysql最佳化MySql
- mysql order by 和 group by 順序問題MySql
- MYSQL Group Replication搭建過程記錄MySql
- MySQL8.0——Resource Group(資源組)MySql
- MGR(MySQL Group Replication)部署搭建測試MySql
- mysql sql_mode ONLY_FULL_GROUP_BYMySql
- MYSQL的GROUP_CONCAT函式MySql函式
- Oracle和MySQL分組查詢GROUP BYOracleMySql
- Mac MySQL5.7 預設開啟 ONLY_FULL_GROUP_BY 模式問題與解決方案MacMySql模式
- 【MySQL】MySQL語句最佳化MySql
- webpack打包最佳化方案Web
- Mysql報錯注入原理分析(count()、rand()、group by)MySql
- mysql函式之——GROUP_CONCAT(轉)MySql函式
- sql最佳化(mysql)MySql
- mysql最佳化索引MySql索引
- MySQL最佳化方向MySql
- 【Mysql】MySQL查詢最佳化-explainMySqlAI