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操作進行隱式排序