MySQL支持降序索引: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

使用降序索引必须符合以下条件:
1、仅InnoDB存储引擎支持降序索引 ,但有以下限制:
(1)、如果索引包含降序索引键列或主键包含降序索引列,则辅助索引不支持更改缓冲。
(2)、InnoDBSQL解析器不使用降序索引。对于InnoDB 全文搜索,这意味着FTS_DOC_ID不能将索引表的列上所需的索引定义为降序索引。有关更多信息,请参见 第15.6.2.4节“ InnoDB FULLTEXT索引”。
2、所有可用升序索引的数据类型均支持降序索引。
3、普通(非生成)列和生成的列(VIRTUAL和 STORED)都支持降序索引。
4、DISTINCT 可以使用包含匹配列的任何索引,包括降序的关键部分。
5、具有降序关键部分的索引不会用于 MIN()/ MAX() 优化调用聚合函数但没有GROUP BY子句的查询。
6、支持降序索引,BTREE但不支持 HASH 索引。FULLTEXT或SPATIAL 索引不支持降序 索引。
7、为,和 索引 明确指定ASC和 DESC指定会 导致错误。 HASHFULLTEXTSPATIAL