前言

海量数据分页,已经无法使用数据库自带的分页机制,比如 MySQL 的 Limit ,这会导致严重的性能问题

性能问题演示

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

offset:指定第一个返回记录行的偏移量

rows:指定返回记录行的最大数目

查询分页

分页offset偏移量计算

$offset = ($page-1) * 10

page:当前页码

10:每页条数

offset:计算的分页偏移量

分页测试

SELECT * FROM mp_tt_creative LIMIT 9999960,10
时间: 9.321s

mysql> EXPLAIN SELECT * FROM mp_tt_creative LIMIT 9999960,10;
+----+-------------+----------------+------------+------+---------------+------+---------+------+----------+----------+-------+
| id | select_type | table          | partitions | type | possible_keys | key  | key_len | ref  | rows     | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+------+---------+------+----------+----------+-------+
|  1 | SIMPLE      | mp_tt_creative | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 16519407 |      100 | NULL  |
+----+-------------+----------------+------------+------+---------------+------+---------+------+----------+----------+-------+
1 row in set

分页优化方案

1、根据id索引优化

如果表中存在 连续 的数字列并 为 索引,那么通过页码即可计算出此字段的范围,直接作范围查询即可:

start = (page-1)*pagesize 
end = page*pagesize 
select * from table where id >start and id <=end
测试

2、根据子查询优化

3、根据第三方工具优化