0

我正在开发一个包含数千个项目的系统,这些项目必须呈现给用户以供选择。每个行项目显示包含大量数据和选项/链接,并且必须从数据库中的许多表中读取以呈现行上的所有信息和链接。并且有数千行。

所以很明显我们过滤或分页或以某种方式限制结果数据集,因为当用户只选择一个时,我们真的不需要在页面上显示 4000 个项目。

假设我们分页。我在这里看到的问题是,例如,为了显示第 3 页,我们必须知道每页有多少项目,然后以某种方式制作一个只检索一页的 3 页的 sql。记住要显示的列表可以是按许多数据列中的任何一个进行排序,所以在我看来,我们必须从数据库中要求返回整个结果集,然后在程序中只选择我们想要的第 3 页中的项目,因为没有办法说在 SQL 中,按 x、y、z 的顺序从 select blah blah blah order 中给我第 30-40 行。

然后是获取数据的问题。我可以一次性完成所有我需要的数据,然后挑选我返回的第 30-40 行,但这是我要丢弃的大部分数据库工作。

所以相反,也许我做一个传递来获取标识符列表,然后我制作另一个更复杂的 sql 来通过某个行标识符上的 IN 子句获取这 10 行所需的所有数据(最好在 PK 中) . 为一页做两遍听起来是一个非常缓慢的想法。我还发现我要求数据库做的工作越多,我的 DBA 就越生我的气。所以理想的做法是在应用服务器上转储尽可能多的工作,但这当然意味着通过网络将大量数据从数据库拉到应用服务器,这也是一个缓慢的解决方案。

那么这是更好的方法吗?还是有另一种更好的范式?

现在假设我们正在过滤。用户有一些他们可以选择的过滤条件。我们遇到了同样的问题,用户可以删除所有过滤器,然后我最终会从数据库中加载 4000 个真正的数据密集型行,这几乎需要我进行分页。

这里的目标是在被迫从大量表中读取大量数据以便能够呈现一页信息的同时获得类似谷歌的快速页面时间。

随着时间的推移,我开始意识到谷歌所做的并不那么复杂。我的意思是搜索页面的结果集具有相当有限的数据集。我不怀疑他们如何获取这些数据非常复杂,但是任何给定的搜索结果都不是由那么多信息组成的。

我的问题是我正在显示的页面上的每一行都有很多信息,并且我受到所有数据分布在一堆表和数据库中的限制。

因此,虽然我意识到我拥有的基础设施永远无法实现类似谷歌的响应时间,但从数据库中呈现页面数据价值的最佳方法是什么?

4

1 回答 1

1

实际上,有一种方法可以让数据库说“从我的查询中给我第 30-40 行”。您正在寻找的是LIMITOFFSET。这可能是最好的解决方案——它让数据库做它最擅长的事情。

LIMIT 和 OFFSET 的文档

此外,听起来您处于考虑缓存的完美位置。您有一组极其昂贵的查询,但它们似乎并没有迅速改变——使用 Memcached 之类的东西来保留查询结果的副本可能很有用。

于 2012-08-28T21:57:46.247 回答