Java 在数据库中排序数据的利弊?

Java 在数据库中排序数据的利弊?,java,database,performance,hibernate,sorting,Java,Database,Performance,Hibernate,Sorting,让我们假设我有一个字段类型为VARCHAR的表。我需要从表中获取数据,按字段的字母顺序排序 最好的方法是什么(提高性能):向SQL查询中添加orderbyfield,或者在已经获取数据时对数据进行排序 我正在使用Java(带Hibernate),但我不能告诉任何关于DB引擎的事情。它可以是任何流行的关系数据库(如MySQL或MS Sql Server或Oracle或HSQL DB或任何其他数据库) 表中记录的数量变化很大,但假设有5k条记录 UPD:二级hibernate缓存(例如EHCache

让我们假设我有一个字段类型为VARCHAR的表。我需要从表中获取数据,按字段的字母顺序排序

最好的方法是什么(提高性能):向SQL查询中添加
orderbyfield
,或者在已经获取数据时对数据进行排序

我正在使用Java(带Hibernate),但我不能告诉任何关于DB引擎的事情。它可以是任何流行的关系数据库(如MySQL或MS Sql Server或Oracle或HSQL DB或任何其他数据库)

表中记录的数量变化很大,但假设有5k条记录


UPD:二级hibernate缓存(例如EHCache)对排序数据的支持程度如何?

对数据库中的数据进行排序-这就是它的(部分)用途。数据库引擎可能比您更擅长对这些数据进行排序。

如果对该字段进行了索引,那么平均数据库在这项任务中的效率将远远高于Java。还要注意,如果是纯显示,通常不会一次检索所有这些行,而是检索其中的一个子集,以便通过分页显示。您也可以在DB级别执行此操作。在Java中对数据进行排序需要将整个表拖到Java内存中,您不希望这样做


在Hibernate中,可以使用和对结果进行排序和分页。例如


我的解决方案是为sort列创建索引,并使用orderby子句编写查询

(对于性能而言)最好的方法是什么:向SQL查询中添加“按字段排序”,或者在已经获取数据时对其进行排序

它是排序依据,而不是排序依据

这是一个折衷的问题:客户端的排序是分布式的,这意味着对服务器的影响较小。但是,它可能需要更多的客户端资源

如果该字段未编制索引,则要返回整个已排序的记录集,服务器需要执行以下操作:

  • 获取整个记录集
  • 分类
  • 通过网络将其发送到客户端
  • ,而在客户端排序只需要点
    1
    3
    (这是资源密集度最低的)

    如果您的服务器需要同时为数百个客户机提供服务,而您的客户机需要整个记录集,那么在客户机端进行排序可能会更有效

    如果字段已编制索引,则数据库可以返回已从该索引排序的数据。但是,这将需要额外的表查找来获取其他字段


    此外,如果您不需要整个记录集,而只需要一些顶部字段(如
    按限制排序
    选择顶部…按顺序
    ),则不需要通过网络获取和传输整个记录集。在这种情况下,在数据库端排序可能会更有效。

    对于只有5000条记录,这并没有多大区别,但我会在数据库中排序;即使字段上没有索引,也可能至少与之后的索引一样快。

    Pro数据库排序:

  • 速度。如果您在orderby条件上有一个索引,那么数据库根本不需要排序,为了获得最大性能,您可以使用聚集索引
  • 易用性。sql查询中的
    order by
    比Java比较器更容易编写和维护
  • 应用程序中的Pro排序:

  • 可定制性。也许您希望按照更详细的标准进行排序,那么Java中的自定义排序将更加灵活
  • 再现性。如果为不同的数据库编写代码,它们可能会有所不同。也许这是个问题,你需要一个特别的订单。在Java中,您可以编写一个命令,以确保所有数据库的输出顺序相同
    • 您通常只提取该数据的一个子集吗?->良好的后端设计(索引和/或分区)有助于更快地提取该子集;然后,数据库上的“orderby”是瞬间的问题
    • 表总是包含几行数据?然后,db上的“order by”是瞬间的问题

    即使你没有(不能)优化你的数据库,你也应该(几乎)总是倾向于将这种操作留给b.e.

    如果你愿意将所有数据都放到内存中,并在内存中使用它,这里有一个库,它将非常适合你的用例


    它像内存中的表一样有效地运行,并允许您对数据执行搜索、过滤和排序,所有这些都在内存中(和java中)。对于您试图处理的记录数量来说,它执行得非常快,并且您不需要与繁重的ORM框架集成

    谢谢,我的坏朋友,我会改正的。上次我这么做差不多是两年前的事了。谢谢这一点。不幸的是,它没有被索引,但我会记住以后的情况。即使这样,在一个像样的数据库中执行此操作比在Java中执行此操作更有效。这是事实。数据库正是为这些数据排列和分组目的而设计的。受益于它的权力。
    List users = session.createCriteria(User.class)
        .addOrder(Order.asc("username"))
        .setFirstResult(0) // Index of first row to be retrieved.
        .setMaxResults(10) // Amount of rows to be retrieved.
        .list();