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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Group by 最佳化
- MySQL Group ReplicationMySql
- mysql group by 執行原理及千萬級別count 查詢最佳化MySql
- Mysql資料庫大表最佳化方案和Mysql大表最佳化步驟MySql資料庫
- group by 語句怎麼最佳化?
- MySQL group replication介紹MySql
- MySQL 大表最佳化方案,收藏了細看!MySql
- MySQL錯誤-this is incompatible with sql_mode=only_full_group_by完美解決方案MySql
- MySQL 之 only_full_group_byMySql
- MySQL查詢最佳化方案彙總(索引相關)MySql索引
- group by排序,derived_merge最佳化的坑排序
- MySQL 預設 only_full_group_byMySql
- mysql group by 取想要的結果MySql
- 最佳化方案
- MYSQL Group Replication搭建過程記錄MySql
- MySQL8.0——Resource Group(資源組)MySql
- mysql order by 和 group by 順序問題MySql
- mysql sql_mode ONLY_FULL_GROUP_BYMySql
- MGR(MySQL Group Replication)部署搭建測試MySql
- mysql最佳化MySql
- Mysql 最佳化MySql
- Mac MySQL5.7 預設開啟 ONLY_FULL_GROUP_BY 模式問題與解決方案MacMySql模式
- 【MySQL】MySQL語句最佳化MySql
- SQL最佳化方案SQL
- MySQL拼接字串,GROUP_CONCAT 值得擁有MySql字串
- Mysql報錯注入原理分析(count()、rand()、group by)MySql
- MySQL8.0.16新特性:The Communication Protocol In Group ReplicationMySqlProtocol
- MySQL最佳化方向MySql
- MySQL最佳化之連線最佳化MySql
- webpack打包最佳化方案Web
- Mysql 5.7 基於組複製(MySQL Group Replication) - 運維小結MySql運維
- 配置Mysql Group Replication遇到的問題筆記MySql筆記
- MySQL sql_mode=only_full_group_by 錯誤MySql
- mysql使用group by實現組內排序實戰MySql排序
- MySQL 中的 distinct 和 group by 的效能比較MySql
- laravel 解決 mysql only_full_group_by 問題LaravelMySql
- mysql 禁用 ONLY_FULL_GROUP_BY,暫時解決錯誤(sql_mode=only_full_group_by)MySql
- MySQL的索引最佳化MySql索引