深分页如何解决

为什么会造成深分页?

假如有张百万数据的表,你想通过分页的方式来展示这些数据。当用户请求第1w页数据时,假设

pagesize=10,那么最终是9万9千,10。数据库必须先扫描前9万9千条数据,才能返回第1w页的数据,

如果你查询返回的字段不在索引中,需要回表很多次,性能明显很低

怎么优化?

假设:SELECT c1, c2, cn… FROM table WHERE name = “Hollis” LIMIT 1000000,10

1.子查询+jion优化

1
2
3
4
5
6
7
8
9
10
SELECT c1, c2, cn...
FROM table
INNER JOIN (
SELECT id
FROM table
WHERE name = "Hollis"
ORDER BY id
LIMIT 1000000, 10
) AS subquery ON table.id = subquery.id

这样的话就不需要每条记录都回表

2.子查询+ID过滤

1
2
3
4
5
6
7
SELECT c1, c2, cn...
FROM table
WHERE name = "Hollis"
AND id >= (SELECT id FROM table WHERE name = "Hollis" ORDER BY id LIMIT 1000000, 1)
ORDER BY id
LIMIT 10

缺点就是ID一定得是自增的

3.记录上一个ID,即游标字段

4.如果是基于文本的搜索,使用ES