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