降序索引
MySQL支持降序索引:DESC
索引定义不再被忽略,而是导致键值以降序存储。以前,索引可以以相反的顺序进行扫描,但会降低性能。降序索引可以按向前顺序进行扫描,这样效率更高。当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化程序可以使用多列索引。
考虑以下表定义,该表定义包含两列和四个两列索引定义,用于定义列上的升序和降序索引的各种组合:
CREATE TABLE t ( c1 INT, c2 INT,INDEX idx1 (c1ASC , c2ASC ),INDEX idx2 (c1ASC , c2DESC ),INDEX idx3 (c1DESC , c2ASC ),INDEX idx4 (c1DESC , c2DESC ) );
该表定义产生四个不同的索引。优化器可以为每个ORDER BY
子句执行前向索引扫描,并且不需要使用filesort
操作:
ORDER BY c1ASC , c2ASC -- optimizer can use idx1ORDER BY c1DESC , c2DESC -- optimizer can use idx4ORDER BY c1ASC , c2DESC -- optimizer can use idx2ORDER BY c1DESC , c2ASC -- optimizer can use idx3
使用降序索引必须符合以下条件:
仅
InnoDB
存储引擎支持降序索引,但有以下限制:- 如果索引包含降序索引键列或主键包含降序索引列,则辅助索引不支持更改缓冲。
- 该
InnoDB
SQL解析器不使用降序索引。对于InnoDB
全文搜索,这意味着FTS_DOC_ID
不能将索引表的列上所需的索引定义为降序索引。有关更多信息,请参见“ InnoDB FULLTEXT索引”。
- 所有可用升序索引的数据类型均支持降序索引。
- 普通(非生成)列和生成的列(
VIRTUAL
和STORED
)都支持降序索引。 DISTINCT
可以使用包含匹配列的任何索引,包括降序的关键部分。- 具有降序关键部分的索引不会用于
MIN()
/MAX()
优化调用聚合函数但没有GROUP BY
子句的查询。 支持降序索引,
BTREE
但不支持HASH
索引。FULLTEXT
或SPATIAL
索引不支持降序索引。为,和索引明确指定
ASC
和DESC
指定会导致错误。HASH
FULLTEXT
SPATIAL