mysql - 有问题的 SQL 实践 - 按 id 而不是创建时间排序

标签 mysql sql database query-optimization

所以我有一个有趣的问题,我不确定它是否被视为“hack”。我查看了一些问题,但没有找到重复的问题,所以就在这里。基本上,我需要知道这是否不可靠或被视为不良做法。

我有一个非常简单的表,它有一个唯一的自动递增 ID 和一个 created_at 时间戳。 (我的问题的简化版本以澄清所讨论的概念)

+-----------+--------------------+
| id        |created_at          |
+-----------+--------------------+
| 1         |2012-12-11 20:35:19 |
| 2         |2012-12-12 20:35:19 |
| 3         |2012-12-13 20:35:19 |
| 4         |2012-12-14 20:35:19 |
+-----------+--------------------+

这两列都是动态添加的,因此可以说新的“插入”将总是具有更大的 ID 并且总是具有更大的日期。

目标 - 非常简单地按降序获取 created_at 排序的结果

解决方案一 - 按日期降序排列的查询

SELECT * FROM tablename
ORDER BY created_at DESC

解决方案二 - 按 ID 降序排序的查询

SELECT * FROM tablename
ORDER BY id DESC

解决方案二是否被视为不良做法?或者解决方案二是正确的做事方式。对你的推理的任何解释都会非常有帮助,因为我试图理解这个概念,而不仅仅是简单地得到答案。提前致谢。

最佳答案

在典型的实践中,您几乎总是可以假设可以对自动增量 ID 进行排序,以按创建顺序(任一方向)为您提供记录。但是,您应该注意,就您的数据而言,这不被认为是可移植的。您可以将数据移动到另一个重新创建 key 的系统,但 created_at 数据是相同的。

其实有个不错的StackOverflow discussion这个问题。

基本总结就是第一种方案,按created_at排序,算是最佳实践。但是,请务必正确索引 created_at 字段以提供最佳性能。

关于mysql - 有问题的 SQL 实践 - 按 id 而不是创建时间排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005631/

相关文章:

MySQL - 如何使用扩展属性?

php - 我想在处理时等待 php 函数(来自另一个调用)

mysql - 保持快捷方式是 MySQL 中的常见做法吗?

mysql - 从 MySql 转储导入到 hive

java - DB中的记录不是一条一条的。 hibernate

javascript - 在php中显示基于特定日期名称的单选按钮

sql - 帮助 Rails find_by 查询

php - PDO 透视表

mysql - 加入来自两个不同服务器的表

php - 提交总是得到最后一个值