回覆列表
-
1 # 變餅檔
-
2 # 愛可生雲資料庫
MySQL長期以來對索引的建立只允許正向asc儲存,就算建立了desc,也是忽略掉。
比如對於以下的查詢,無法發揮索引的最佳效能。
查詢一:select * from tb1 where f1 = ... order by id desc;查詢二:2. select * from tb1 where f1 = ... order by f1 asc , f2 desc;
那對於上面的查詢,尤其是資料量和併發到一定峰值的時候,則對OS的資源消耗非常大。一般這樣的SQL在查詢計劃裡面會出現using filesort等狀態。
比如針對下面的表t1,針對欄位rank1有兩個索引,一個是正序的,一個是反序的。不過在MySQL 8.0 之前的版本都是按照正序來儲存。
按照rank1 正向排序的執行計劃,
按照rank1 反向排序的執行計劃,
從執行計劃來看,反向比正向除了extra裡多了Using temporary; Using filesort這兩個,其他的一模一樣。這兩個就代表中間用到了臨時表和排序,一般來說,凡是執行計劃裡用到了這兩個的,效能幾乎都不咋地。除非我這個臨時表不太大,而用於排序的buffer也足夠大,那效能也不至於太差。那這兩個選項到底對效能有多大影響呢?
order by 後面跟一條語句的話,那order by還會起到什麼作用呢。可以把那條查詢的語句放到某個欄位中,然後按欄位再進行排序