从RDMS中提取大型列表数据的最有效方法是什么?

时间:2012-08-28 13:08:35

标签: database performance

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

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

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

然后就是获取数据的问题。我可以在一次通过中获取我将需要的所有数据,然后选择我回来的30-40行,但这是我将要扔掉的大部分数据库上的大量工作。 / p>

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

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

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

这里的目标是快速使用类似Google的页面时间,同时强制从大量表格中读取大量数据,以便能够呈现一页信息。

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

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

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

1 个答案:

答案 0 :(得分:1)

实际上,有一种方法可以让数据库说“从我的查询中给我30-40行”。您要找的是LIMITOFFSET。这可能是最好的解决方案 - 它让数据库能够做到最好的。

Documentation for LIMIT and OFFSET

此外,听起来你处于一个考虑缓存的完美位置。你有一套极其昂贵的查询,但它们似乎没有快速改变 - 使用像Memcached这样的东西来保存查询结果的副本可能很有用。

相关问题