当前位置: 首页 > 最新文章 > 正文

MySQL深度分页:数千万的数据如何快速分页?

背景在后端开发中,为了防止一次加载过多的数据造成过多的内存和磁盘IO开销,往往需要按页显示。此时,需要使用MySQL的limit关键字。当存在大量数据时,最可能由限制引起的问题之一是深度分页。Mysql深度分页第一式:复用分页查询的特性决定了它可以有效利用上一次查询的结果,举例:select id, name, address, phoneFROM customersWHERE id > 990O

admin

背景在后端开发中,为了防止一次加载过多的数据造成过多的内存和磁盘IO开销,往往需要按页显示。此时,需要使用MySQL的limit关键字。当存在大量数据时,最可能由限制引起的问题之一是深度分页。Mysql深度分页第一式:复用分页查询的特性决定了它可以有效利用上一次查询的结果,举例:select id, name, address, phoneFROM customersWHERE id > 990ORDER BY id LIMIT 10;通过where条件来缩小查询范围,当然不是每个查询都有id做where条件,但也可以使用其他条件:SELECT id, usernameFROM customersWHERE username > ‘shull@iheavy.com’ORDER BY username LIMIT 10;不一定好用!这可能会让页面变得凌乱。

背景

在后端开发中,为了防止一次加载过多的数据造成过多的内存和磁盘IO开销,往往需要按页显示。此时,需要使用MySQL的limit关键字。当存在大量数据时,最可能由限制引起的问题之一是深度分页。

Mysql深度分页第一式:复用

分页查询的特性决定了它可以有效利用上一次查询的结果,举例:

select id, name, address, phoneFROM customersWHERE id > 990ORDER BY id LIMIT 10;

通过where条件来缩小查询范围,当然不是每个查询都有id做where条件,但也可以使用其他条件:

SELECT id, usernameFROM customersWHERE 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, phoneFROM customersINNER JOIN (SELECT idFROM customersORDER BY nameLIMIT 10 OFFSET 990)AS my_results USING(id);

Mysql深度分页第三式:维护一个页或者位置列

维护一个页列

SELECT id, name, address, phoneFROM customersWHERE page = 100ORDER BY name;

维护一个位置列

SELECT id, name, address, phoneFROM customersWHERE place BETWEEN 990 AND 999ORDER BY name;

麻烦的是,当您(a)插入一行(b)删除一行(c)使用update移动一行时,您需要更新该列。这可能会让页面变得凌乱。

参考资料

【1】https://www.iheavy.com/2013/06/19/3-ways-to-optimize-for-paging-in-mysql/


上一篇: 用肥皂洗手的英文(肥皂英语怎么说soap) 下一篇:Base64编码简介及简单实现
返回顶部