【发布时间】:2020-10-01 17:57:43
【问题描述】:
我需要对托管在 MySQL 上的超过 3000 万用户进行分页。我每页显示 15 个用户,但速度很慢。我的目标是访问任何随机页面并在几毫秒内加载它。
一开始,我使用 MySQL 的 offset 方法,但正如我所说,它很慢(而且肯定是个坏主意)。然后我搬到了 ElasticSearch,但你仍然有一些窗口限制,所以你是有限的。在那之后,我一直在检查不同的方法,比如“光标”方法,但我无法访问任何随机页面。例如,我们从第一页开始,我们有 100000 个页面,我想访问第 4782 个页面,并在几毫秒内加载它。使用 cursor 方法,我只能访问下一个 && prev 页面,而“scroll”方法并不适合我真正需要的。
我的用户 ID 不是按 ID 排序的,所以我不能用它作为分隔符。已经想到Late row lookups
我不介意将所有数据移至新数据库(但会寻找不同的解决方案)。亚马逊在这方面做得很好 (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:我的用户列表几乎是实时的,所以它每小时都在变化。
有什么想法吗?非常感谢!
【问题讨论】:
-
我只是对您的用例感到好奇。为什么有人需要访问第 2667 页上的第 40K 用户,就像随机的那样?
-
例如,如果我是您想在该列表中找到您的用户,并且在知道您的位置几乎在末尾之后,您将需要手写该页面。
标签: mysql performance pagination cursor offset