mysql中两次排序_MySQL中的两种排序方式: index和filesort
index :通過有序索引順序掃描直接返回有序數(shù)據(jù),不需要額外的排序,操作效率較高。
filesort:通過對返回數(shù)據(jù)進行排序,filesort 并不代表通過磁盤文件排序,而是說明進行了一個排序操作,至于排序操作是否使用了磁盤文件或臨時表等,則取決于MySQL服務(wù)器對排序參數(shù)的設(shè)置和需要排序數(shù)據(jù)的大小。
一般而言,filesort是通過相應(yīng)的排序算法,將所取得的數(shù)據(jù)在sort_buffer_size系統(tǒng)變量設(shè)置的內(nèi)存排序區(qū)中進行排序,如果內(nèi)存裝載不下,它就會將磁盤上的數(shù)據(jù)進行分塊,再對各個數(shù)據(jù)塊進行排序,然后將各個塊合并成有序的結(jié)果集。
sort_buffer_size設(shè)置的排序區(qū)是每個線程獨占的,所以同一時刻,MySQL中存在多個sort buffer排序區(qū)。
優(yōu)化:盡量減少額外排序,通過索引直接返回有序的數(shù)據(jù)。where 條件和order by 使用了相同的索引,并且order by 的順序和索引順序相同,并且order by 的字段都是升序或者降序,否則肯定需要額外的排序操作,這樣就會出現(xiàn) filesort。
以下SQL可以使用索引:
select * from tablename order by key_part1,key_part2,....;
select * from tablename where key_part1=1 order by key_part1 desc,key_part2 desc;
select * from tablename order by key_part1 desc,key_part2 desc;
以下SQL不可以使用索引:
select * from tablename order by key_part1 desc,key_part2 asc;? ----order by 的字段混合asc,desc
select * from tablename where key2=constant order by key1;? ----用于查詢的關(guān)鍵字與order by 中所使用的不相同
select * from tablename order by key1,key2;? ? ?----對不同的關(guān)鍵字使用order by
對于Filesort,MySQL有兩種排序算法 :
一次掃描算法和兩次掃描算法,通過比較系統(tǒng)變量max_length_for_sort_data的大小和query語句總字段的大小來判斷使用哪種排序算法。
適當(dāng)增加 max_length_for_sort_data的值,適當(dāng)增加sort_buffer_size排序區(qū),盡量使用具體的字段而不是select * 選擇所有字段。
在CPU和IO之間平衡。
總結(jié)
以上是生活随笔為你收集整理的mysql中两次排序_MySQL中的两种排序方式: index和filesort的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql事务实战_mysql事务隔离级
- 下一篇: mysql my.cnf在哪里_my.c