数据库中的结果分页是如何工作的?

u5i3ibmn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(368)

这是一个适用于mysql、oracledb或其他任何可能存在的问题。
我知道mysql有限制偏移量,大小;对甲骨文来说,有“行\号”之类的。
但是,当这种“分页”查询被背靠背调用时,数据库引擎是否真的再次执行整个“选择”,然后每次检索不同的结果子集?或者它是否只执行一次结果的整体获取,将结果保存在内存中,然后根据偏移量和大小为后续查询提供来自它的结果子集?
如果它每次都执行完全回迁,那么它似乎效率很低。
如果它只执行一次完全获取,那么它必须以某种方式将查询“存储”在某个地方,以便下次该查询进入时,它知道它已经获取了所有数据,只需要从中提取下一页。在这种情况下,数据库引擎将如何处理多个线程?执行同一查询的两个线程?
我很困惑:(

yks3o0rb

yks3o0rb1#

我不同意比尔·卡尔文。首先,不要在没有测量的情况下预先假设某个东西是快还是慢,并且预先将代码复杂化,一次下载12页并缓存它们,因为“在我看来它会更快”。
雅格尼原则-程序员不应该添加功能,直到认为有必要。
用最简单的方法(一页的普通分页),测量它在生产中的工作情况,如果速度慢,那么尝试另一种方法,如果速度令人满意,就保持原样。
根据我自己的实践-一个从包含大约80000条记录的表中检索数据的应用程序,主表与4-5个额外的查找表连接,整个查询分页,每页大约25-30条记录,总共大约2500-3000页。数据库是oracle12c,在一些列上有索引,查询是由hibernate生成的。对服务器端生产系统的测量表明,检索一个页面的平均时间(中位数为50%)约为300毫秒。95%的百分比小于800毫秒,这意味着检索单个页面的请求的95%小于800毫秒,当我们添加从服务器到用户的传输时间和大约0.5-1秒的渲染时间时,总时间不到2秒。够了,用户很高兴。
和一些理论-看看这个答案,知道什么是分页模式的目的

mccptt67

mccptt672#

是的,当您以不同的偏移量运行查询时,会再次执行查询。
是的,这是低效的。如果您需要对一个大的结果集进行分页,请不要这样做。
我建议只做一次查询,有一个很大的限制-足够10或12页。然后将结果保存到缓存中。当用户希望浏览多个页面时,应用程序可以获取保存在缓存中的10-12个页面,并显示用户希望看到的页面。这通常比为每个页面运行sql查询快得多。
如果像大多数用户一样,您的用户只阅读了几页,然后更改了他们的查询,那么这种方法很有效。
请回复您的意见:
我所说的缓存是指memcached或redis之类的东西。一种高速的内存键/值存储器。
mysql视图不存储任何内容,它们更像是为您运行预定义查询的宏。
oracle支持物化视图,这样可能会更好,但是查询视图会有解释sql查询的开销。
更简单的内存缓存应该快得多。

相关问题