首页 > 解决方案 > 如何有效地对超过 10M 的记录进行分页

问题描述

我需要对托管在 MySQL 上的超过 3000 万用户进行分页。我每页显示 15 个用户,但速度很慢。我的目标是访问任何随机页面并在几毫秒内加载它。

一开始,我使用 MySQL 的 offset 方法,但正如我所说,它非常慢(而且肯定是个坏主意)。然后我搬到了 ElasticSearch,但你仍然有一些窗口限制,所以你是有限的。在那之后,我一直在检查不同的方法,比如“光标”方法,但我无法访问任何随机页面。例如,我们从第一页开始,我们有 100000 个页面,我想访问第 4782 个页面,并在几毫秒内加载它。使用 cursor 方法,我只能访问下一个 && prev 页面,而“scroll”方法并不适合我真正需要的。

我的用户 ID 不是仅按 ID 排序的,因此我不能将其用作分隔符。已经考虑过延迟行查找

我不介意将所有数据移动到新数据库(但会找到不同的解决方案)。亚马逊在这里做得很好(https://www.amazon.com/review/top-reviewers

使用偏移量查询:

SELECT users.* from users
WHERE users.country = 'DE'
ORDER BY users.posts_count DESC, users.id DESC
LIMIT 15 OFFSET 473

PD:我的用户列表几乎是实时的,所以它每小时都在变化。

有任何想法吗?非常感谢!

标签: mysqlperformancepaginationcursoroffset

解决方案


“访问第 4782 页”——这个用例是什么?“分页”对几页有用,可能是几十页,但不是几千页。

[Next]、[Prev]、[First]、[Last] 很有用。但是,如果您想要一个随机探测,则将其称为 [随机] 探测,而不是“第 4782 页”。

OFFSET效率低下。这是对替代方案的讨论:http: //mysql.rjweb.org/doc.php/pagination

同时添加INDEX(country, posts_count, id)


推荐阅读