limit越往后越慢,如何解决?

问题原因

limit 10000,20意味着扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行;

查询数据量和偏移量成正比。

优化方法

游标分页

也就是前端传递last_id的那种做法。弊端是cursor方式分页只适合用于有顺序的数据且不支持跳页。

利用子查询或join走覆盖索引

-- 传统limit,文件扫描
[SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2;
受影响的行: 0
时间: 5.371s

-- 子查询方式,索引扫描
[SQL]
SELECT * FROM tableName
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1)
LIMIT 2;
受影响的行: 0
时间: 0.274s

-- JOIN分页方式
[SQL]
SELECT *
FROM tableName AS t1
JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2;
受影响的行: 0
时间: 0.278s

参考

  1. 游标分页
  2. 利用子查询或join走覆盖索引
原文地址:https://www.cnblogs.com/yudidi/p/12659635.html