• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 降序索引

    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
    

    使用降序索引必须符合以下条件:

    • InnoDB存储引擎支持降序索引,但有以下限制:

      • 如果索引包含降序索引键列或主键包含降序索引列,则辅助索引不支持更改缓冲。
      • InnoDBSQL解析器不使用降序索引。对于InnoDB全文搜索,这意味着FTS_DOC_ID不能将索引表的列上所需的索引定义为降序索引。有关更多信息,请参见“ InnoDB FULLTEXT索引”。
    • 所有可用升序索引的数据类型均支持降序索引。
    • 普通(非生成)列和生成的列(VIRTUALSTORED)都支持降序索引。
    • DISTINCT可以使用包含匹配列的任何索引,包括降序的关键部分。
    • 具有降序关键部分的索引不会用于MIN()/MAX()优化调用聚合函数但没有GROUP BY子句的查询。
    • 支持降序索引,BTREE但不支持HASH索引。FULLTEXTSPATIAL索引不支持降序索引。

      为,和索引明确指定ASCDESC指定会导致错误。HASHFULLTEXTSPATIAL