order by 索引失效
為什麼只有order by 欄位出現在where條件中時,才會利用該欄位的索引而避免排序。這要說到資料庫如何取到我們需要的資料了。
一條SQL實際上可以分為三步。
1.得到資料
2.處理資料
3.返回處理後的資料
比如上面的這條語句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc
第一步:根據where條件和統計資訊生成執行計劃,得到資料。
第二步:將得到的資料排序。
當執行處理資料(order by)時,資料庫會先檢視第一步的執行計劃,看order by 的欄位是否在執行計劃中利用了索引。如果是,則可以利用索引順序而直接取得已經排好序的資料。如果不是,則排序操作。
第三步:返回排序後的資料。
注:ORACLE或者DB2都有一個空間來供SORT操作使用(上面所說的記憶體排序),如ORACLE中是使用者全域性區(UGA),裡面有SORT_AREA_SIZE等引數的設定。如果當排序的資料量大時,就會出現排序溢位(硬碟排序),這時的效能就會降低很多了。
總結:
當order by 中的欄位出現在where條件中時,才會利用索引而不排序,更準確的說,order by 中的欄位在執行計劃中利用了索引時,不用排序操作。
這個結論不僅對order by有效,對其他需要排序的操作也有效。比如group by 、union 、distinct等。