我的自动增量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是否有任何实际的性能优势?
我的怀疑/推理如下: 我假设更近期的用户会更活跃(即更频繁地访问表),因此使索引更有效。
我的理解是否正确?
答案 0 :(得分:16)
Kazimieras Aliulis在评论中指出,support for descending indexes is being added in MySQL 8.0:
MySQL支持降序索引:索引定义中的DESC为no 更长时间忽略但导致按键降序存储键值。 以前,索引可以按相反的顺序扫描,但是在a 性能惩罚。可以向前扫描降序索引 订单,这是更有效的。降序索引也是如此 优化器可以使用多列索引 最有效的扫描顺序混合了某些列的升序和 其他人的降序。
index_col_name规范可以以ASC或DESC结尾。这些 允许使用关键字以用于指定升序的未来扩展 或降序索引值存储。目前,他们被解析但是 忽略;索引值始终按升序存储。
对于另一个实现此功能的RBDMS,例如SQL Server,the DESC
specification is only beneficial when sorting by compound indexes ...并且不会对新创建的用户与旧用户的查找时间产生影响。
答案 1 :(得分:9)
index_col_name规范可以以ASC或DESC结尾。这些 允许使用关键字以用于指定升序的未来扩展 或降序索引值存储。目前,他们被解析但是 忽略;索引值始终按升序存储。
答案 2 :(得分:7)
有一天,我已经通过简单而精彩的技巧给出了如何为mysql制作降序索引:只需添加另一个带负值(镜像值)的列。比方说,对于unsigned int,它只是value*-1
- 因此,它适用于unix时间戳。
对于varchars,这个想法很相似,但实现有点复杂。
答案 3 :(得分:0)
在MySQL中,为索引定义ASC或DESC不仅不受支持,而且也没有意义。 MySQL可以根据需要在两个方向上遍历索引,因此不需要明确定义顺序。