我想有关于从数据库中获取数据的建议。例如,我在数据库中有数百万个数据,我想使用某种编程语言在我的网页中将其显示为每页 10 行。
那么最好的方法是什么,
- 获取所有数据并进行分页
- 或仅获取有限的数据。
由于在第一种方式中数据获取可能存在数据操作的机会,例如,如果我汇集所有数据并显示它,并且用户在数据显示后更改了一些细节。只需一个小小的改变,我就需要再次获取所有数百万的数据。
而在第二种数据获取方式中,我需要始终连接数据库以获取每页 10 行。
请澄清我的疑问
到目前为止,最简单的选择是根据Per 的回答中的建议仅根据需要获取数据。但是,这可能不会产生最佳性能(尽管如果应用程序不是性能关键的,我不会费心做更多的事情)。
如果只显示 10 条记录,请不要获取数百万条记录。虽然一个值得考虑的选项(如果您的应用程序对数据具有独占访问权限)是始终加载所有数据,并简单地将数据库更多地用作备份设备,您仅在应用程序重新启动时才从中读取,我认为数以百万计这个模型的行数有点多。
尽管缓存可能是一个不错的选择。维基百科有一个缓存算法列表。我可能会建议最近最少使用。
服务器端缓存通常是一个不错的考虑因素。危险- 此处数据结构的低效选择(或缺乏对应用程序使用方式的了解)可能会影响应用程序的性能。
客户端缓存可以提供更快的应用程序响应时间,尤其是在延迟较高的情况下。请记住,每个用户都有他/她自己的缓存 - 这仅适用于某些应用程序。
除了常规缓存之外,对于上述任何一项,您都可以加载假设 10 行周围的 10 行(假设用户通常会转到下一页/上一页,并且此操作实际上是有意义的)。100 将是此处使用的数字 - 理想的数字很大程度上取决于您的应用程序的使用方式。
以 Stack Overflow 为例,最常见的(选择)查询可能是显示新问题的列表。这些都可以被缓存(服务器端),因此不需要数据库查询来获取它们。
对于服务器端缓存,如果您的应用程序对数据具有独占访问权限 - 每当有任何更改时,这些都会通过您的应用程序进行,因此您可以简单地修改本地副本或清除缓存,无需查询数据库即可查看如果它改变了。
对于客户端缓存,或者如果您的应用程序没有对数据的独占访问权限 - 您可以在数据库中的某处添加版本控制或最后修改的值,您可以查询以检查更新。
无论如何,使用具有查询级别限制/分页的有限数据获取进行分页。在我看来,加载所有数据不是一种选择,因为它会给系统资源带来不必要的压力,而且实际上编码稍微困难一些。
有一个页面变量,并使用它来创建传递给数据查询的参数。如何实际进行查询完全依赖于数据库。
MySQL 的简单示例可以是两步查询:
select count(*) from ... where ...
得到可能结果的数量,然后
select ... from ... where ... limit *offset*,*count*
其中 *count* 是每页的项目数,*offset* 是 *count* 乘以页码。对您查询的每个页面进行两次查询,以捕获更改。