SQL语句
-- 假设按order_time升序分页
SELECT order_id, order_time
FROM orders
WHERE order_time > (
SELECT order_time
FROM (
SELECT order_time
FROM orders
ORDER BY order_time
LIMIT 20 OFFSET (页码 - 1) * 20
) AS subquery
)
ORDER BY order_time
LIMIT 20;
优化思路
- 索引优化:在
order_time
字段上创建索引,因为查询条件和排序都依赖这个字段,索引可以大大加快数据的查找和排序速度。
CREATE INDEX idx_order_time ON orders (order_time);
- 避免全表扫描:上述SQL通过子查询获取到上一页最后一条数据的
order_time
,然后在主查询中使用WHERE order_time >
来过滤数据,避免了全表扫描,特别是在大数据量的情况下,极大提升了查询效率。而如果直接使用LIMIT 偏移量, 数量
的方式,随着偏移量增大,性能会急剧下降,因为数据库需要从第一条记录开始计算偏移量。
- 分页算法优化:采用基于时间戳的分页方式,相较于传统的基于偏移量的分页,在大数据量场景下更具优势,减少了数据库扫描的数据量。