mysql解决大数据量的深度分页问题

假设有一个包含数百万条记录的表,想通过分页的方式来展示这些数据。当用户请求第10000页数据时,假设pageSize为10,那么最终就是LIMIT 99990,10 ,数据库必须先扫描过前99990条记录,才能返回第10000页的数据,这会导致显著的性能下降。

inner join 优化

原sql:

SELECT c1, c2, ... FROM table WHERE name = "xxx" LIMIT 1000000,10

优化后sql:

SELECT c1, c2, ...
FROM table t1
INNER JOIN (
    SELECT id
    FROM table
    WHERE name = "xxx"
    ORDER BY id
    LIMIT 1000000, 10
) AS t2 ON t1.id = t2.id

子查询来获取限定条件下的一小部分主键id,然后使用这些 id 在主查询中获取完整的行数据。在name有索引的情况下,子查询中查询id是不需要回表的,当查询出想要的10个ID之后,基于ID查询目标数据不仅快,而且要查的数据量也很少。

自增id的查询优化

SELECT c1, c2, cn...
FROM table
WHERE name = "xxx"
  AND id >= (SELECT id FROM table WHERE name = "xxx" ORDER BY id LIMIT 1000000, 1)
ORDER BY id
LIMIT 10

代替了join的方式,使用了一个子查询来获取从哪里开始分页的参考点,基于ID做范围查询。但是这个方案有个弊端,那就是要求ID一定要是自增的。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部