我有一个包含一些数据的Mysql表(>百万行)。我需要根据以下标准对数据进行排序
1)最新
2)最古老的
3)评分最高
4)评分最低
开发排序功能的推荐解决方案是什么
1)对于每个reuest,执行带有所需连接和orderBy条件的DBQuery并返回已排序的数据
2)从表中获取所有数据(未排序),将数据放入缓存中。编写自定义比较器(java)来对数据进行排序。
我倾向于#2,因为DB上的负载只有一次。而且,应用程序代码比DBQuery更好。
请分享你的想法......
谢谢, KARTHIK
答案 0 :(得分:3)
尽可能多地在数据库中执行操作。请注意,如果您有1,000,000行,则返回所有百万行几乎是无用的。你打算在网站上显示这个吗?我想不是。你真的关心第500,000个最不受欢迎的帖子吗?我想不是。
在数据库中进行排序并返回前100行,500行或1000行。
答案 1 :(得分:0)
从数据库中获取一百万行听起来像一个糟糕的主意。它会产生大量的网络流量,并且需要相当长的时间来传输所有数据。没有提到在应用程序中为存储数百万个对象而需要分配的内存量。
因此,如果您只能通过查询获取子集,请执行此操作。总的来说,尽可能多地在数据库中进行过滤。
我没有看到在单个队列中排序有任何问题。如果您不能使用UNION
,则可以随时使用SELECT
。
答案 2 :(得分:0)
在数据库中执行此操作要快得多:
1)数据库针对I / O操作进行了优化,可以使用索引和其他数据库优化来改善响应时间
2)将数据库中的数据传递给应用程序将所有数据都存入内存。该应用程序必须查看所有数据,以便在没有优化算法的情况下对其进行重新排序
3)数据库只将最小化必需数据存入mamemory,这可能远远少于所有必须移动到java的数据
4)您始终可以在数据库上创建额外的索引以提高查询性能。
答案 3 :(得分:0)
我想说DB上的操作总是会更快。您应该确保DB上的缓存是ON并且正常工作。确保您没有在查询中使用now()
,因为它将禁用mysql缓存。看看here mysql查询缓存是如何工作的。基本的。查询是基于字符串缓存的,因此如果每次获取时查询字符串都不同,则不使用缓存。
答案 4 :(得分:0)
如果让数据库对数据进行排序,AFAIK通常会运行得更快。
关于应用程序级别与数据库级别的代码,我会同意存储过程的情况,但在SELECT中排序很好恕我直言。
如果你想向用户显示数据也考虑分页(在这种情况下你最好还是在数据库级别进行排序)。
答案 5 :(得分:0)
你没有四个任务,你有两个:
排序最新的IS EQUAL来排序最旧的 和 排序最高等级IS等于最低等级。
所以你需要对db进行两次调用。是的在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
答案 6 :(得分:0)
我知道这是一个旧帖子,但它出现在我的搜索中,所以我想发表我的意见。 我有点老了,但对于那么多行,我会考虑从数据库中转储数据(每个RDBMS都有自己的方法。看起来像MySQL的MySQLDump命令:Link) 然后,您可以使用java库或操作系统中可用的排序算法或工具来处理此问题。
请注意您要求数据库执行的工作。请记住,它必须可用于服务其他请求。不要只为一个请求“提供它的膝盖”,除非它是一个夜间批处理周期类型的场景,并且您确定它不会被要求做任何其他事情。