前言
海量数据分页,已经无法使用数据库自带的分页机制,比如 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
测试