MySQL 8.0新特性 -- 降序索引


mysql 8開始支持降序索引:在索引定義中使用desc不再被忽略,存儲鍵值是按照降序的方式存儲。在之前的版本中,可以按照反向順序掃描索引,但是會有性能犧牲。
降序索引可以正向順序掃描,效率更高。當最有效的掃描順序混合了某些列的升序和其他列的降序時,降序索引也使優化器能夠使用多列索引。

考慮如下表定義:

create table t (
  c1 int, c2 int,
  index idx1 (c1 asc, c2 asc),
  index idx2 (c1 asc, c2 desc),
  index idx3 (c1 desc, c2 asc),
  index idx4 (c1 desc, c2 desc)
);

 

優化器對下面的查詢,可以通過索引正向掃描來執行order by語句,而不需要使用filesort。

order by c1 asc, c2 asc    -- optimizer can use idx1
order by c1 desc, c2 desc  -- optimizer can use idx4
order by c1 asc, c2 desc   -- optimizer can use idx2
order by c1 desc, c2 asc   -- optimizer can use idx3

 

降序索引的使用必須滿足以下條件:

·innodb只是適用於innodb存儲引擎,並且受到以下限制:
  -如果索引包含一個降序鍵的列,或者主鍵包含一個降序的索引列,changebuffer不支持
  -innodb的sql解析器不使用降序索引

·降序索引和升序索引一樣,支持所有的數據類型
·distinct可以使用降序索引
·降序索引支持btree,但是不支持hash索引
·降序索引不支持全文索引、空間索引·降序索引支持常規索引,和gernerated列(virtual\stored類型的列)
·對於有聚合函數調用,但是沒有group by語句時,min()/max()查詢優化不會使用帶有降序鍵的索引進行優化
·降序索引的引入,MySQL 8.0再也不會對group by操作進行隱式排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM