這篇文章將為大家詳細(xì)講解有關(guān)MySQL 5.7 ORDER BY排序的優(yōu)化是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
為泰興等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及泰興網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、泰興網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!在一些情況下,MySQL可以使用索引而無需額外的排序來執(zhí)行ORDER BY排序。
即使ORDER BY沒有匹配上指定的索引,也可以使用索引,只要所有未使用索引部分和所有ORDER BY字段是WHERE語句的常數(shù)。
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不會(huì)使用索引進(jìn)行排序
查詢使用多個(gè)不同的索引進(jìn)行排序
SELECT * FROM t1 ORDER BY key1, key2;
查詢?cè)谒饕姆沁B續(xù)部分上使用排序
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;
排序中既有ASC又有DESC
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
用于獲取數(shù)據(jù)的索引不同于ORDER BY排序的索引
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
查詢使用表達(dá)式進(jìn)行排序,而不是使用索引的字段名進(jìn)行排序
SELECT * FROM t1 ORDER BY ABS(key); SELECT * FROM t1 ORDER BY -key;
查詢關(guān)聯(lián)了許多表,并且ORDER BY使用的字段不是返回行的第一個(gè)非常量表中的字段(在EXPLAIN執(zhí)行計(jì)劃輸出中第一個(gè)表的連接類型不是const)
查詢使用不同的ORDER BY和GROUP BY表達(dá)式
在排序中只使用了一個(gè)字段的前綴索引
索引沒有按照順序存儲(chǔ)行,例如MEMORY表的HASH索引
如果一個(gè)查詢包含GROUP BY,但是你不想將查詢結(jié)果排序,可以通過ORDER BY NULL語句來取消排序
INSERT INTO foo SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
與提升ORDER BY速度相關(guān)的系統(tǒng)參數(shù):
增加sort_buffer_size參數(shù)的值。理想狀況下,這個(gè)參數(shù)的值應(yīng)該足夠大,可以將整個(gè)結(jié)果集放入到sort buffer中,避免到磁盤中進(jìn)行排序。
存儲(chǔ)在緩沖區(qū)的列值的大小是由max_sort_length參數(shù)決定的。
想要監(jiān)控排序在磁盤上的合并數(shù)量,可以通過觀察Sort_merge_passes這個(gè)狀態(tài)參數(shù)。
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參數(shù)的值。
定義列的時(shí)候,僅分配它們需要的值,這樣每行在排序時(shí)可以使用更少的內(nèi)存。例如,如果每列的值不超過16個(gè)字符,CHAR(16)比CHAR(200)更好。
改變tmpdir系統(tǒng)變量,將其指向一個(gè)專用的大容量的文件系統(tǒng)目錄。
如果ORDER BY排序沒有使用索引,但是語句中帶有LIMIT語句,優(yōu)化器可能會(huì)避免使用合并文件而是在內(nèi)存中進(jìn)行排序。
關(guān)于MySQL 5.7 ORDER BY排序的優(yōu)化是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。