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