23

我有一个用户表键入自动增量 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

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

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

我的理解正确吗?

4

4 回答 4

25

MySQL 8.0 的更新答案

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

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


早期版本的原始答案

DESCMySQL 中当前未实现索引...引擎忽略提供的排序并始终使用ASC

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

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

于 2012-04-12T19:17:09.377 回答
10

MySQL 5.6 文档

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

于 2012-12-25T13:02:14.143 回答
7

有一天,我得到了一个简单而绝妙的技巧,如何为 mysql 创建一个降序索引:只需添加另一列负数(镜像值)。说,对于 unsigned int 它只是value*-1- 所以,它适用于 unix 时间戳。
对于 varchars,这个想法是相似的,但实现要复杂一些。

于 2012-12-25T13:26:03.647 回答
0

在 MySQL 中为索引定义 ASC 或 DESC 不仅不受支持,而且毫无意义。MySQL 可以根据需要双向遍历索引,因此不需要显式定义顺序。

于 2012-04-13T13:04:51.510 回答