我的数据库中有一些带有日期的条目。什么是最好的?:
- 使用 sql 语句获取它们并应用
order by
. - 用 sql 获取列表,并在应用程序中使用 orso 对它们进行排序
collection.sort
?
谢谢
我的数据库中有一些带有日期的条目。什么是最好的?:
order by
.collection.sort
?谢谢
这是一个很难回答的非常广泛的问题,很大程度上取决于您所说的best是什么意思?
从性能的角度来看,您只需进行测量以确定系统的哪一部分是瓶颈。数据库通常非常高效,但仍可能与将工作分担给客户端相关。
从关注点分离的角度来看,这取决于排序在应用程序中的重要性以及应用程序的分层方式。
问问你自己:“数据排序的知识属于哪里?” 和“如果我从关系数据库存储更改为不同的东西会发生什么”。
在某种程度上,这取决于完整集合中有多少值。例如,如果是 20-30 个值,那么您可以在任何地方进行排序——即使是相对较差的排序算法也可以快速完成(尽管避免Stooge 排序;这很糟糕)——因为这就是您可能期望的数据块大小实际获取一个服务响应。
但是一旦你进入更大的数据集,你需要更加仔细地计划。特别是,您希望避免在不必要的情况下移动数据。如果数据当前仅存在于数据库中,那么您真的不想将其全部提取到客户端只是为了对其进行排序(一个相对昂贵的操作),然后几乎将其全部丢弃。实际开始时最好将数据库中的数据进行排序,这样按顺序提取数据就变得微不足道了;在关系数据库术语中,保持数据排序在功能上与维护数据索引相同。实际上,您可以对数据有多个索引,这可以使相当复杂的查询变得更快。(NoSQL DB 更加多样化;有些甚至不支持保持数据排序的概念。
所以……回到您的问题,您可能不想尝试不对应用程序中的数据进行排序:对于大多数数据,适当的索引可以更有效,因为它让您的代码甚至不查看不需要的数据。但是,如果您出于其他原因必须将其全部提取到您的应用程序中,并且您无法将其带入预先排序的状态,则没有理由避免自己对其进行排序:Java 的排序算法高效且稳定。但是您应该衡量以新顺序从数据库中获取它是否更快。(问题是数据库开销是否超过了重新排序的超线性成本;很多问题都在“可能;很难说”是答案的领域。)
另一件需要平衡的事情是,您的代码是否更简单,不自己进行排序而是始终将其委托给数据库。让您的代码更简单(并且更无错误)是一个很好的目标……</p>
数据库管理系统 (DMBS) 已针对这些任务进行了优化,因此我认为您应该坚持使用它们。特别是如果您从用 PHP 或(其他脚本语言)编写的脚本访问数据库,使用脚本执行该任务可能会更慢。如果您使用脚本对数组进行排序,您也可能会达到 PHP 允许使用的内存限制。
我并不是要提出不同编程语言的性能问题,只是想指出,尽可能依赖 DMBS 是一种非常好的做法。
这对我来说是一个非常有趣的问题,我想提出公认答案的另一面,顺便说一句,这是一个非常好的答案,我不一定*不同意。只想呈现另一面。当我开始我的职业生涯时,我正在研究大型机 DB2,而教我的老前辈们非常坚持在 db 之外进行排序。他们这样做的理由是可以卸载它的工作,这使数据库可以自由地为其他请求提供服务。当然,它远比这更微妙。一般来说,我会说您正在权衡的因素是:A)您的数据库有多忙或对您的系统有多重要?如果您的数据库非常繁忙,如果您在客户端或应用服务器上有大量 OLTP 处理,并且您的客户端或应用服务器有大量过剩容量,为什么不在应用服务器或客户端上排序?即使它的效率较低,它也会将工作分散到整个系统中,并从整个系统的角度为您提供更多的吞吐量。B) 排序有多大?比如说,因为您对海量 MB 的数据进行了排序,所以破坏您的调用堆栈或 Java 堆是很愚蠢的。C) 在您的应用程序或应用程序服务器中进行排序会导致暂停、延迟等吗?换句话说,如果您的特定编程语言的排序库非常糟糕,并且您不想编写自己的库,那么让 DB 花费 0.5 秒可能比让您的应用程序花费 5.0 秒要好。炸毁您的调用堆栈或 Java 堆,因为您对大量 MB 数据进行了排序。C) 在您的应用程序或应用程序服务器中进行排序会导致暂停、延迟等吗?换句话说,如果您的特定编程语言的排序库非常糟糕,并且您不想编写自己的库,那么让 DB 花费 0.5 秒可能比让您的应用程序花费 5.0 秒要好。炸毁您的调用堆栈或 Java 堆,因为您对大量 MB 数据进行了排序。C) 在您的应用程序或应用程序服务器中进行排序会导致暂停、延迟等吗?换句话说,如果您的特定编程语言的排序库非常糟糕,并且您不想编写自己的库,那么让 DB 花费 0.5 秒可能比让您的应用程序花费 5.0 秒要好。
因此,与所有事物一样,“这取决于”;-)。但是,我认为这些是它所依赖的东西。