使用 SQL 还是作为集合对列表进行排序?

2022-09-04 21:27:05

我的数据库中有一些带有日期的条目。什么是最好的?

  • 使用 sql 语句获取它们并应用 。order by
  • 使用sql获取列表,并在应用程序中对它们进行排序?collection.sort

谢谢


答案 1

这是一个非常广泛的问题,很难回答,这在很大程度上取决于你所说的最好是什么意思?

  • 性能的角度来看,您只需进行测量即可确定系统的哪个部分是瓶颈。数据库通常非常高效,但它仍然可能与将工作卸载到客户端有关。

  • 关注点分离的角度来看,这取决于排序在应用程序中的重要性以及应用程序的分层方式。

问问你自己:“数据排序的知识属于哪里?”“如果我从关系数据库存储切换到不同的东西会发生什么”。


答案 2

在某种程度上,这取决于完整集合中有多少个值。如果它是20-30个值,那么你可以在任何地方排序 - 即使是相对较差的排序算法也可以快速做到这一点(虽然避免Stooge Sort;这很糟糕) - 因为这是你可能期望在一个服务响应中实际获取的数据块的大小。

但是,一旦你进入更大的数据集,你需要更仔细地计划。特别是,如果不需要,您希望避免移动数据。如果数据当前仅存在于数据库中,那么您真的不想将其全部提取到客户端中只是为了对其进行排序(一个相对昂贵的操作),然后几乎全部丢弃。首先将数据保留在数据库中进行排序要好得多,这样按顺序拾取数据就微不足道了。在关系数据库术语中,保持数据排序在功能上与维护数据的索引相同。实际上,您可以对数据设置多个索引,这甚至可以使相当复杂的查询变得很快。(NoSQL数据库更加多样化;有些甚至不支持保持数据排序的概念。维护索引的缺点是它们占用更多空间并且需要时间来维护,尤其是在首先创建数据时。

所以。。。回到你的问题,你可能想尽量不对应用程序中的数据进行排序:对于大多数数据,适当的索引可以更有效,因为它让你的代码甚至不查看不需要的数据。但是,如果您出于其他原因必须将其全部提取到应用程序中,并且无法将其预先排序,则没有理由避免自己对其进行排序:Java的排序算法高效且稳定。但是,您应该衡量以新顺序从数据库获取它是否更快。(问题是数据库开销是否超过重新排序的超线性成本;许多问题都存在于“也许;很难说“是答案。

另一件需要平衡的事情是,你的代码是否更容易不自己进行排序,而是始终将其委托给数据库。保持你的代码更简单(更无错误)是一个很好的目标,