c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引
原創作者:楊濤濤
我們今天來介紹下 MySQL 8.0 引入的新特性:倒序索引。
MySQL長期以來對索引的建立只允許正向asc存儲,就算建立了desc,也是忽略掉。
比如對于以下的查詢,無法發揮索引的最佳性能。
- 查詢一:
- 查詢二:
那對于上面的查詢,尤其是數據量和并發到一定峰值的時候,則對OS的資源消耗非常大。一般這樣的SQL在查詢計劃里面會出現using filesort等狀態。
比如針對下面的表t1,針對字段rank1有兩個索引,一個是正序的,一個是反序的。不過在MySQL 8.0 之前的版本都是按照正序來存儲。
按照rank1 正向排序的執行計劃,
按照rank1 反向排序的執行計劃,
從執行計劃來看,反向比正向除了extra里多了Using temporary; Using filesort這兩個,其他的一模一樣。這兩個就代表中間用到了臨時表和排序,一般來說,凡是執行計劃里用到了這兩個的,性能幾乎都不咋地。除非我這個臨時表不太大,而用于排序的buffer也足夠大,那性能也不至于太差。那這兩個選項到底對性能有多大影響呢?
我們分別執行這兩個查詢,并且查看MySQL的session級的status就大概能看出些許不同。
通過以上兩張圖,我們發現反向的比正向的多了很多個計數,比如通過掃描的記錄數增加了10倍,而且還伴有10倍的臨時表的讀和寫記錄數。那這個開銷是非常巨大的。那以上的查詢是在MySQL 5.7 上運行的。
MySQL 8.0 給我們帶來了倒序索引(Descending Indexes),也就是說反向存儲的索引。 這里不要跟搜索引擎中的倒排索引混淆了,MySQL這里只是反向排序存儲而已。不過這個倒序存儲已經解決了很大的問題。我們再看下之前在MySQL 5.7 上運行的例子。
我們把數據導入到MySQL 8.0,
再把原來的索引變為倒序索引,
再次看下第二個SQL的查詢計劃,
很顯然,用到了這個倒序索引 idx_rank1_desc,而這里的臨時表等的信息消失了。
當然了,這里的組合比較多,比如我這張表的字段rank1,rank2兩個可以任意組合。
組合一:
(rank1 asc,rank2 asc);- 組合二:
- 組合三:
- 組合四:
我把這幾個加上,適合的查詢比如:
- 查詢一:
- 查詢二:
- 查詢三:
等等,這里就不一一示范了。
歷期文章回顧
愛可生云數據庫:新特性解讀 | MySQL 8.0 新增 HINT 模式
愛可生云數據庫:新特性解讀 | MySQL 8.0 索引特性2-索引跳躍掃描
愛可生云數據庫:新特性解讀 | MySQL 8.0 索引特性1-函數索引
愛可生云數據庫:新特性解讀 | MySQL 8.0 通用表達式
總結
以上是生活随笔為你收集整理的c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python缩进格式作用_关于自动缩进格
- 下一篇: linux cmake编译源码,linu