前言

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

性能问题演示

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

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

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

查询分页

分页offset偏移量计算

1
$offset = ($page-1) * 10

page:当前页码

10:每页条数

offset:计算的分页偏移量

分页测试

1
2
3
4
5
6
7
8
9
10
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索引优化

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

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

2、根据子查询优化

3、根据第三方工具优化