Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL索引性能-ASC与DESC_Mysql_Sql_Indexing_Primary Key - Fatal编程技术网

Mysql SQL索引性能-ASC与DESC

Mysql SQL索引性能-ASC与DESC,mysql,sql,indexing,primary-key,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`), )

我在一个自动递增的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有什么实际的性能优势吗

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

我的理解正确吗?

MySQL 8.0的更新答案 正如Kazimieras Aliulis在评论中指出的那样:

MySQL支持降序索引:索引定义中的DESC为no 不再被忽略,但会导致按降序存储键值。 以前,索引可以按相反的顺序扫描,但扫描速度较慢 表现惩罚。降序索引可以向前扫描 秩序,这是更有效的。降序索引也会使 当 最有效的扫描顺序混合了某些列和列的升序 其他的按降序排列


早期版本的原始答案

索引列名称规范可以以ASC或DESC结尾 关键字允许用于将来的扩展以指定升序 或递减索引值存储。目前,它们已被解析,但 忽略;索引值始终按升序存储


对于另一个实现此功能的RBDM,例如SQL Server。。。并且不会影响新创建用户与旧用户的查找时间。

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

来自:

索引列名称规范可以以ASC或DESC结尾 关键字允许用于将来的扩展以指定升序 或递减索引值存储。目前,它们已被解析,但 忽略;索引值始终按升序存储


有一天,我学到了一个简单而精彩的诀窍,如何为mysql创建一个降序索引:只需添加另一个带负数的列(镜像值)。比如,对于unsigned int,它只是
值*-1
——因此,它适用于unix时间戳。

对于varchars,想法类似,但实现有点复杂。

DESC
在使用
自动增量
这类重复问题时,会大量分割索引。。。检查这里:我认为没有任何区别。唯一重要的是列之间的相对排序顺序,并且仅用于范围查询。这并不完全正确。对于复合索引,它将非常有用。例如,我想在COLU a ASC、COLU b DESC上定义一个复合索引,因为这就是我在查询中排序的方式。不幸的是,MySQL不支持这一点,因此我的查询无法使用索引。那么如何从
col1,col2
索引计算
ORDER BY col1 ASC,col2 DESC
?不是,索引不用于此。From:在某些情况下,MySQL不能使用索引来解析ORDER BY,尽管它仍然使用索引来查找与WHERE子句匹配的行。这些情况包括:[…]您混合了ASC和DESC,因此无法按col1 ASC为
ORDER创建索引,MySQL中的col2 DESC
?听起来好像这意味着,如果我有一个带有10000个id的int字段的表,并且在这个字段上有一个唯一的索引,那么
select*from table where id=1
的解析速度会比
select*from table where id=10000000
?理论上可能会更快,但我没有发现任何实用的方法向前或向后读取的索引之间的性能差异。实际上,我现在就试过了,反复发现
按主键顺序说明限制1
按主键顺序ASC限制1
快,尽管“差异”在误差范围内。@你的常识嘿!我需要索引一个使用降序排序的查询。你能解释一下这个把戏吗?我不太明白:(@Colandus创建一列,其中值乘以-1。即,对于值1,新列将为-1,对于10,将为-10,依此类推。然后为新列添加索引。按ASC排序,它将按旧列排序desc@Your常识啊,这很聪明,谢谢分享。这是一篇老帖子,但万一有人好奇,
DESC
索引到目前为止仍未实现,谢谢您的更新,@CodeCommander!我认为Michael Fredrickson的回答应该更新为包含此更新。Mysql 8将有desc索引: