SQL索引性能 - ASC与DESC

时间:2012-04-12 19:15:14

标签: 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

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

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

我的理解是否正确?

4 个答案:

答案 0 :(得分:16)

更新了MySQL 8.0的答案

Kazimieras Aliulis在评论中指出,support for descending indexes is being added in MySQL 8.0

  

MySQL支持降序索引:索引定义中的DESC为no   更长时间忽略但导致按键降序存储键值。   以前,索引可以按相反的顺序扫描,但是在a   性能惩罚。可以向前扫描降序索引   订单,这是更有效的。降序索引也是如此   优化器可以使用多列索引   最有效的扫描顺序混合了某些列的升序和   其他人的降序。


早期版本的原始答案

DESC indexing is not currently implemented in MySQL... the engine ignores the provided sort and always uses ASC:

  

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

对于另一个实现此功能的RBDMS,例如SQL Server,the DESC specification is only beneficial when sorting by compound indexes ...并且不会对新创建的用户与旧用户的查找时间产生影响。

答案 1 :(得分:9)

来自MySQL 5.6 documentation

  

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

答案 2 :(得分:7)

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

答案 3 :(得分:0)

在MySQL中,为索引定义ASC或DESC不仅不受支持,而且也没有意义。 MySQL可以根据需要在两个方向上遍历索引,因此不需要明确定义顺序。