SQL索引性能 - ASC与DESC

pja*_*ama 13 mysql sql indexing primary-key

我有一个用户表,键入一个自动增量int列,看起来像这样:

CREATE TABLE `user_def` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) NOT NULL,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name_UNIQUE` (`user_name`),
) ENGINE=MyISAM
Run Code Online (Sandbox Code Playgroud)

使用DESC索引(主键)而不是默认ASC有任何实际的性能优势吗?

我的怀疑/推理如下:我假设更近期的用户会更活跃(即更频繁地访问表),从而使索引更有效率.

我的理解是否正确?

Mic*_*son 16

更新了MySQL 8.0的答案

正如Kazimieras Aliulis在评论中所指出的,MySQL 8.0中正在添加对降序索引的支持:

MySQL支持降序索引:索引定义中的DESC不再被忽略,但会导致按键降序存储键值.以前,索引可能以相反的顺序扫描,但性能会受到影响.可以按正向顺序扫描降序索引,这样更有效.当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化器可以使用多列索引.


早期版本的原始答案

DESC索引当前没有在MySQL中实现...引擎忽略提供的排序并始终使用ASC:

index_col_name规范可以以ASC或DESC结尾.这些关键字允许用于将来的扩展,以指定升序或降序索引值存储.目前,他们被解析但被忽略; 索引值始终按升序存储.

对于实现此功能的另一个RBDMS,例如SQL Server,DESC规范仅在按复合索引排序时有用 ...并且不会对新创建的用户与旧用户的查找时间产生影响.

  • 这是一篇老帖子,但是如果有人好奇的话,`DESC`索引仍然没有实现[MySQL 5.7根据最新文档](http://dev.mysql.com/doc/refman/5.7/en /create-index.html) (2认同)

And*_*eKR 9

MySQL 5.6文档:

index_col_name规范可以以ASC或DESC结尾.这些关键字允许用于将来的扩展,以指定升序或降序索引值存储.目前,他们被解析但被忽略; 索引值始终按升序存储.

  • 那么如何根据 `col1, col2` 索引计算 `ORDER BY col1 ASC, col2 DESC`? (2认同)

You*_*nse 7

总有一天,我已经通过简单而精彩的技巧给出了如何为mysql制作降序索引:只需添加另一个带负值(镜像值)的列.比方说,对于unsigned int,它只是value*-1- 所以,它适用于unix时间戳.
对于varchars,这个想法很相似,但实现起来有点复杂.