索引與Order By

Order By 將對結果進行排序,這裏的排序最大的特色是資源密集型,儘管多數時候它同時也是CPU密集型的。
數據庫在進行排序時,必須緩衝臨時結果,讀取到全部輸入,並在完整的排序操做後才能產生第一個輸出。這些操做要麼在內存中就能處理掉,要麼須要藉助磁盤空間(各RDBMS實現不一樣),但都避免不了很多的內存消耗,後者更是涉及耗時的磁盤IO。數據庫

 

而鏈接是不一樣的,它無需緩衝整個中間結果集,中間結果的每一條記錄能夠當即傳遞到下一個join操做,鏈接是流水線操做。排序

 

索引,特別是B樹索引,能夠當作是數據的一種有序存儲方式。這意味着Order By實際上是能夠利用索引中的有序數據,這有2層意思,一是Order By能夠避免本身排序操做,索引中的數據已是有序的,二是無需緩衝結果集,能夠流水線處理。索引

 

數據庫能夠從兩個方向讀取索引,當索引中的順序與Order By子句中指定的順序相反時,不會影響流水線處理。MySQL忽略索引聲明中的ASC與DESC修飾。(當索引多列時排序方向的影響可能須要進一步分析)爲了適用索引,Order By字段必須包含於Where子句使用的索引中。內存

 

一些有排序處理的操做也適用,如Group By,雖然SQL標準沒有要求,但實際上多數DBMS實現時會在Group By上構建一個臨時索引並在此基礎上進行排序,因此沒有指令時Group By輸出可能也是有序的。資源

相關文章
相關標籤/搜索