在后端开发中,为了防止一次加载过多的数据造成过多的内存和磁盘IO开销,往往需要按页显示。此时,需要使用MySQL的limit关键字。当存在大量数据时,最可能由限制引起的问题之一是深度分页。
Mysql深度分页第一式:复用分页查询的特性决定了它可以有效利用上一次查询的结果,举例:
select id, name, address, phone
FROM customers
WHERE id > 990
ORDER BY id LIMIT 10;
通过where条件来缩小查询范围,当然不是每个查询都有id做where条件,但也可以使用其他条件:
SELECT id, username
FROM customers
WHERE username > ‘shull@iheavy.com’
ORDER BY username LIMIT 10;
不一定好用!
Mysql深度分页第二式:延迟联接如果想要查询第99页:
SELECT id, name, address, phone FROM customers ORDER BY name LIMIT 10 OFFSET 990;
那么可以试试:
SELECT id, name, address, phone
FROM customers
INNER JOIN (
SELECT id
FROM customers
ORDER BY name
LIMIT 10 OFFSET 990)
AS my_results USING(id);
Mysql深度分页第三式:维护一个页或者位置列
维护一个页列
SELECT id, name, address, phone
FROM customers
WHERE page = 100
ORDER BY name;
维护一个位置列
SELECT id, name, address, phone
FROM customers
WHERE place BETWEEN 990 AND 999
ORDER BY name;
麻烦的是,当您(a)插入一行(b)删除一行(c)使用update移动一行时,您需要更新该列。这可能会让页面变得凌乱。