当前位置: 代码网 > it编程>数据库>Mysql > MySql中深度分页的问题处理

MySql中深度分页的问题处理

2024年05月26日 Mysql 我要评论
什么是深度分页?mysql深度分页的问题,就是比如我们需要所查询出的表数据量较大,需要进行查询结果返回集的后面部分,所出现的性能问题。比如说我们有一个一百万数据量的表,我们分页需要查询99990,10

什么是深度分页?

mysql深度分页的问题,就是比如我们需要所查询出的表数据量较大,需要进行查询结果返回集的后面部分,所出现的性能问题。

比如说我们有一个一百万数据量的表,我们分页需要查询99990,10,数据库通常情况下会先扫描前99990条数据, 再进行分页返回最后10条,这样就会导致查询接口性能变慢,随着offset值的增大,查询性能会显著下降。

这是因为mysql需要扫描从第一条记录到offset指定的位置,然后返回limit数量的结果,这在大数据集中会导致大量的磁盘i/o操作和较慢的查询响应时间。

解决方案

1. 子查询过滤主键id

因为mysql中主键id数据聚集索引,所有的数据都存储在该节点的叶子节点上,所以如果我们使用了id过滤条件

mysql就会跳过前面的索引,也就不会扫描前方的数据,进行一个高效的过滤查询

其实这也就是利用inndedb中主键索引的优点,但是这有一个前提的咱们的主键id必须是自增id

select * from table_name
2where id >= (select id from table_name order by some_column limit 100000, 1)
3order by some_column limit 10;

2. 基于子查询进行优化

select a.* from table_name a inner join (
select
 id
from 
table_name
where name="**"
order by id 
limit 10000 10
) b on a.id=b.id

在inndedb中,子查询中name是索引的情况下是不需要回表的

当基于我们需要范围id中能快速找出我们所需要对应的数据,深度分页带来的性能问题也能游刃而解

且这种方式是返回的具体的id集合,不仅快而且数据量也是我们指定

3. 倒序分页

如果数据是按时间戳或其他递增字段排序的,可以考虑倒序查询

即先找出最大的id,然后逐步往前查,这在某些场景下可以提高效率

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com