2

我有一个带有一些数据(> 百万行)的 Mysql 表。我需要根据以下标准对数据进行排序

1) 最新

2) 最老的

3) 最高评价

4) 评分最低

开发排序功能的推荐解决方案是什么

1) 对于每个排序请求,执行一个带有所需连接和 orderBy 条件的 DBQuery,并返回排序后的数据

2)从表中获取所有数据(未排序),将数据放入缓存中。编写自定义比较器(java)对数据进行排序。

我倾向于#2,因为 DB 上的负载只有一次。此外,应用程序代码比 DBQuery 更好。

请分享你的想法......

谢谢, 卡提克

4

7 回答 7

4

在数据库中做尽可能多的事情。请注意,如果您有 1,000,000 行,则返回全部百万几乎没有用。你打算在网站上显示这个吗?我想不是。你真的关心第 500,000 个最不受欢迎的帖子吗?再说一次,我认为不是。

因此在数据库中进行排序并返回前 100、500 或 1000 行。

于 2012-04-12T22:02:14.147 回答
0

如果让数据库对数据进行排序,AFAIK 通常应该运行得更快。

关于应用程序级别与数据库级别的代码,我同意在存储过程的情况下,但在 SELECTs 中排序很好恕我直言。

如果您想向用户显示数据,还可以考虑分页(在这种情况下,您最好在数据库级别进行排序)。

于 2012-04-12T22:04:45.203 回答
0

你没有四个任务,你有两个:

排序最新等于排序最旧和排序最高评分等于排序最低评分。

所以你需要对 db 进行两次调用。是的,在数据​​库中排序。然后不是每次都调用排序,而是这样做:

1] track the timestamp of the latest record in the db
2] before calling to sort and retrieve entire list, check if date has changed
3] if date has not changed, use the list you have in memory
4] if date has changed, update the list 
于 2012-04-12T22:23:42.403 回答
0

从数据库中获取一百万行听起来是个糟糕的主意。它将产生大量的网络流量,并且需要相当长的时间来传输所有数据。更不用说您需要在应用程序中分配用于存储数百万个对象的内存量。

因此,如果您只能通过查询获取子集,请执行此操作。总的来说,在数据库中尽可能多地进行过滤。

而且我认为在单个队列中订购没有任何问题。UNION如果您不能将其作为 one使用,则可以随时使用SELECT

于 2012-04-12T21:56:53.670 回答
0

在数据库中执行此操作要快得多:

1) 数据库针对 I/O 操作进行了优化,可以使用索引和其他 DB 优化来提高响应时间

2)将数据从数据库中取出到应用程序中,将所有数据放入内存中。在没有优化算法的情况下,应用程序将不得不查看所有数据以对其进行重新排序

3)数据库只将最少必要的数据放入mamemory,这比必须移动到java的所有数据要少得多

4)您总是可以在数据库上创建额外的索引来提高查询性能。

于 2012-04-12T21:59:22.640 回答
0

我会说对 DB 的操作总是会更快。您应该确保 DB 上的缓存已打开并且工作正常。确保您没有now()在查询中使用,因为它会禁用 mysql 缓存。看看这里mysql 查询缓存是如何工作的。在基本。查询是基于字符串缓存的,因此如果每次获取时查询字符串都不同,则不使用缓存。

于 2012-04-12T21:59:50.000 回答
0

我知道这是一个旧线程,但它出现在我的搜索中,所以我想发表我的意见。我有点老派,但是对于那么多行,我会考虑从您的数据库中转储数据(每个 RDBMS 都有自己的方法。看起来像 MySQL 的 MySQLDump 命令:Link)然后您可以使用排序算法或工具处理它在您的 java 库或操作系统中可用。

小心你要求你的数据库做的工作。请记住,它必须可用于服务其他请求。不要只为一个请求“屈服”,除非它是夜间批处理循环类型的场景,并且您确定不会要求它执行任何其他操作。

于 2014-04-02T13:54:35.457 回答