MySQL 5.7 ORDER BY排序的優化
在一些情況下,MySQL可以使用索引而無需額外的排序來執行ORDER BY排序。
即使ORDER BY沒有匹配上指定的索引,也可以使用索引,只要所有未使用索引部分和所有ORDER BY欄位是WHERE語句的常數。
查詢使用多個不同的索引進行排序
查詢使用不同的ORDER BY和GROUP BY表示式
在排序中只使用了一個欄位的字首索引
索引沒有按照順序儲存行,例如MEMORY表的HASH索引
如果一個查詢包含GROUP BY,但是你不想將查詢結果排序,可以通過ORDER BY NULL語句來取消排序
增加sort_buffer_size引數的值。理想狀況下,這個引數的值應該足夠大,可以將整個結果集放入到sort buffer中,避免到磁碟中進行排序。
儲存在緩衝區的列值的大小是由max_sort_length引數決定的。
想要監控排序在磁碟上的合併數量,可以通過觀察Sort_merge_passes這個狀態引數。
mysql> show global status like 'Sort_merge_passes';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Sort_merge_passes | 0 |
+-------------------+-------+
1 row in set (0.11 sec)
增加read_rnd_buffer_size引數的值。
定義列的時候,僅分配它們需要的值,這樣每行在排序時可以使用更少的記憶體。例如,如果每列的值不超過16個字元,CHAR(16)比CHAR(200)更好。
改變tmpdir系統變數,將其指向一個專用的大容量的檔案系統目錄。
如果ORDER BY排序沒有使用索引,但是語句中帶有LIMIT語句,優化器可能會避免使用合併檔案而是在記憶體中進行排序。
即使ORDER BY沒有匹配上指定的索引,也可以使用索引,只要所有未使用索引部分和所有ORDER BY欄位是WHERE語句的常數。
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; SELECT * FROM t1 WHERE key_part1 = constant ORDER BY key_part2; SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1 WHERE key_part1 = 1 ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1 WHERE key_part1 > constant ORDER BY key_part1 ASC; SELECT * FROM t1 WHERE key_part1 < constant ORDER BY key_part1 DESC; SELECT * FROM t1 WHERE key_part1 = constant1 AND key_part2 > constant2 ORDER BY key_part2;在某些情況下,MySQL不會使用索引進行排序
查詢使用多個不同的索引進行排序
SELECT * FROM t1 ORDER BY key1, key2;查詢在索引的非連續部分上使用排序
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;排序中既有ASC又有DESC
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;用於獲取資料的索引不同於ORDER BY排序的索引
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;查詢使用表示式進行排序,而不是使用索引的欄位名進行排序
SELECT * FROM t1 ORDER BY ABS(key); SELECT * FROM t1 ORDER BY -key;查詢關聯了許多表,並且ORDER BY使用的欄位不是返回行的第一個非常量表中的欄位(在EXPLAIN執行計劃輸出中第一個表的連線型別不是const)
查詢使用不同的ORDER BY和GROUP BY表示式
在排序中只使用了一個欄位的字首索引
索引沒有按照順序儲存行,例如MEMORY表的HASH索引
如果一個查詢包含GROUP BY,但是你不想將查詢結果排序,可以通過ORDER BY NULL語句來取消排序
INSERT INTO foo SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;與提升ORDER BY速度相關的系統引數:
增加sort_buffer_size引數的值。理想狀況下,這個引數的值應該足夠大,可以將整個結果集放入到sort buffer中,避免到磁碟中進行排序。
儲存在緩衝區的列值的大小是由max_sort_length引數決定的。
想要監控排序在磁碟上的合併數量,可以通過觀察Sort_merge_passes這個狀態引數。
mysql> show global status like 'Sort_merge_passes';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Sort_merge_passes | 0 |
+-------------------+-------+
1 row in set (0.11 sec)
增加read_rnd_buffer_size引數的值。
定義列的時候,僅分配它們需要的值,這樣每行在排序時可以使用更少的記憶體。例如,如果每列的值不超過16個字元,CHAR(16)比CHAR(200)更好。
改變tmpdir系統變數,將其指向一個專用的大容量的檔案系統目錄。
如果ORDER BY排序沒有使用索引,但是語句中帶有LIMIT語句,優化器可能會避免使用合併檔案而是在記憶體中進行排序。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-2122017/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL order by排序導致效率低小優化MySql排序優化
- mysql order by 優化MySql優化
- MySQL 5.7:desc order by反向定位MySql
- MySQL——優化ORDER BY語句MySql優化
- MySQL Order BY 排序過程MySql排序
- Order by 優化優化
- MySQL order by 排序結果不正確MySql排序
- MySQL distinct 和 order by 排序混淆的替代方案MySql排序
- MySql5.7及以上 ORDER BY 報錯問題MySql
- MySQL按指定順序排序(order by field的使用)MySql排序
- MYSQL order by排序與索引關係總結MySql排序索引
- MySQL 5.7 優化不能只看執行計劃MySql優化
- MySQL LIMIT 和 ORDER BY 最佳化MySqlMIT
- MySQL:關於排序order by limit值不穩定的說明(1)MySql排序MIT
- sqlserver使用order by case when進行優先順序排序SQLServer排序
- order by改分組排序排序
- MySQL5.7被一條排序SQL弄當機MySql排序
- Mysql 5.7憂化配置詳解MySql
- Orderby 排序優化排序優化
- MySQL最優配置模板( 5.6&5.7轉)MySql
- [Hive]Hive排序優化Hive排序優化
- 快速排序及優化排序優化
- 快速排序及其優化排序優化
- Mysql系列第八講 詳解排序和分頁(order by & limit)及存在的坑MySql排序MIT
- MySQL 之 ORDER BY FIELDMySql
- MySQL 5.7的角色功能MySql
- mysql order by是怎麼工作的?MySql
- thinkphp where in order 按照順序in的迴圈排序PHP排序
- MySQL優化(1)——–常用的優化步驟MySql優化
- MySQL Order by 語句用法與最佳化詳解MySql
- mysql優化MySql優化
- Mysql 優化MySql優化
- 如何優化氣泡排序?優化排序
- 插入排序以及優化排序優化
- 氣泡排序及優化排序優化
- MySQL, Incorrect usage of UNION and ORDER BYMySql
- MySql ORDER BY索引是否失效MySql索引
- group by排序,derived_merge優化的坑排序優化
- MySQL架構的優化MySql架構優化