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