MySQL的最佳实践问题:按ID或日期排序?

时间:2010-01-30 03:53:45

标签: mysql sql-order-by

这是一个愚蠢的问题,但我从来没有得到过直接答案。

假设我有一个包含以下字段和值的数据库表:

| id | date_added          | balance |
+------------------------------------+
|  1 | 2009-12-01 19:43:22 | 1237.50 |
|  2 | 2010-01-12 03:19:54 |  473.00 |
|  3 | 2010-01-12 03:19:54 | 2131.20 |
|  4 | 2010-01-20 11:27:31 | 3238.10 |
|  5 | 2010-01-25 22:52:07 |  569.40 |
+------------------------------------+    


这是一个非常基本的“会计”子系统。我想获得最新的余额。 id字段设置为auto_increment。通常,我会使用:

SELECT balance FROM my_table ORDER BY date_added DESC LIMIT 1;

但我需要让完全确定返回的值是最新的...(请参阅上面的ID#2& 3)

1)我会更好地使用:

SELECT balance FROM my_table ORDER BY id DESC LIMIT 1;

2)或者这是一个更好的解决方案吗?:

SELECT balance FROM my_table ORDER BY date_added,id DESC LIMIT 1;


AFAIK,auto_increment效果很好,但它是否足够可靠,可以对这个至关重要的东西进行排序?这就是为什么我认为按两个字段进行排序是一个更好的主意,但是当我在过去这样做时,我在MySQL中看到了一些非常古怪的行为。或者,如果有更好的解决方案,我将非常感谢您的意见。


提前致谢!

布赖恩

3 个答案:

答案 0 :(得分:9)

如果 有机会在同一日期添加两个,您可能需要:

SELECT balance FROM my_table ORDER BY date_added DESC,id DESC LIMIT 1;

(注意两个字段的'descending'子句。)

但是,当有人添加2月2 nd 的调整条目时,你需要考虑你想要发生的事情,该日期为31 st 1月确保1月份完成。它的ID将大于2月1 st 的ID。

通常,会计系统只适用于该日期。也许如果您能告诉我们为什么订单很重要,我们可以提出其他建议。


回应你的评论:

  

我很想听到你可能有的任何其他想法或建议,即使他们不在话题,因为我对会计型数据库模型一无所知。

我会提供一些建议 - 这是我能立刻想到的,我通常会用更少的鼓励来发出更多的“建议”:-)前两个,更多的数据库相关而不是会计相关的,是:

首先,以第三范式执行所有,只有在遇到性能问题时才会恢复。这将为您节省大量的焦虑,重复数据可能会失去一步。即使您确实还原,也可以使用触发器和其他DBMS功能来确保数据不会失控。

例如,如果要加快对last_name列的搜索速度,可以创建upper_last_name列(已编制索引),然后使用该列查找与您已经在大写的搜索词匹配的记录。这几乎总是比每行函数upper(last_name)更快。您可以使用插入/更新触发器来确保始终正确设置upper_last_name,这仅在名称更改时产生成本,而不是每次搜索时都会产生成本。

其次,除非您可以使用相同的触发器类型技巧来保证数据不会失步,否则不要跨表(例如当前架构)复制数据。当您向客户发送最终余额与起始余额加购买不匹配的发票时,您的客户会怎么做?这不会让你的公司看起来很专业: - )

第三(这与会计相关),您通常不需要担心动态计算余额时的交易数量。这是因为会计系统通常在年底具有翻转功能,这会重置期初余额。

因此,您通常不会一次处理超过一年的数据,除非您是美国政府或微软,否则不会那么费力。

答案 1 :(得分:3)

id可能更快,但datetime更安全;如果性能问题添加索引,请使用后者。

答案 2 :(得分:2)

就我个人而言,我从不相信这种自动增量。我按日期排序。

我很确定ID保证是唯一的,但不一定是连续的和增加的。