欢迎投稿

今日深度:

MySql中深度分页的问题处理,

MySql中深度分页的问题处理,


目录
  • 什么是深度分页?
  • 解决方案
    • 1. 子查询过滤主键ID
    • 2. 基于子查询进行优化
    • 3. 倒序分页
  • 总结

    什么是深度分页?

    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,然后逐步往前查,这在某些场景下可以提高效率

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持PHP之友。

    您可能感兴趣的文章:
    • MySQL百万数据深度分页优化思路解析
    • MySQL调优之SQL查询深度分页问题
    • 如何解决mysql深度分页问题
    • MySQL深度分页(千万级数据量如何快速分页)

    www.htsjk.Com true http://www.htsjk.com/Mysql/48765.html NewsArticle MySql中深度分页的问题处理, 目录 什么是深度分页? 解决方案 1. 子查询过滤主键ID 2. 基于子查询进行优化 3. 倒序分页 总结 什么是深度分页? MySql深度分页的问题,就是比如我们需要...
    评论暂时关闭