博客
关于我
MySQL 深度分页性能急剧下降,该如何优化?
阅读量:793 次
发布时间:2023-02-10

本文共 2266 字,大约阅读时间需要 7 分钟。

MySQL深度分页优化方法

在实际应用中,使用select * limit offset, rows进行深度分页时,可能会面临性能瓶颈,特别是在数据量较大的情况下。这时候,我们需要采取一些优化策略来提升查询效率。以下是一些常用的优化方法和实际案例分析。

1. 模仿百度、谷歌方案(前端业务控制)

类似于前端分页的做法,每次只加载一定数量的数据(如100页),而不是一次性加载大量数据。这样可以减少后端处理的负担,提升性能。

示例:

  • 每次加载100条数据,用户可以通过分页控件(如分页器)来控制数据量。
  • 优点:减少了后端的随机读取操作,提升了数据库性能。

2. 记录每次取出的最大ID,使用where语句筛选

这种方法适用于有主键ID的情况。通过记录每次查询的最大ID,可以快速获取下一批数据。

示例:

select * from table where id > 最大id limit 10000, 10
  • 这里,最大id是前一次查询的最大值。
  • 优点:减少了全表扫描,提升了查询效率。

3. 使用IN获取ID列表

通过IN子句获取满足条件的ID列表,再进行批量查询。

示例:

select * from table where id in (select id from table where user = 'xxx') limit 10000, 10
  • 这种方法适用于需要根据用户信息进行分页的情况。
  • 优点:减少了随机读取的次数,提升了性能。

4. 使用join方式 + 覆盖索引(推荐)

这种方法结合了join和覆盖索引,适用于需要同时满足wherelimit条件的情况。

示例:

select * from table inner join (select id from table where user = 'xxx' limit 10000, 10) b using (id)
  • 需要设计一个覆盖索引,确保查询高效率。
  • 优点:覆盖索引减少了索引树的深度,提升了查询速度。

5. DB索引分区器使用方式

这种方法适用于需要根据主键分块查询的情况。通过分块查询,可以减少每次查询的数据量,提升性能。

步骤:

  • 统计总数据量:
    select count(1) as countAllNumber from test_table
  • 计算每块的数据量:
    countAllNumber / 4 = 50
  • 分块查询:
    • 第一块:select id from test_table where id > 0 limit 50, 1
    • 第二块:select id from test_table where id > 51 limit 50, 1
    • 依此类推,直到所有数据分块完成。
  • 优点:

    • 减少了每次查询的数据量,提升了数据库性能。
    • 适用于需要分页分块查询的情况。

    6.案例:jdbcpagingReaderdb索引分区器

    jdbcpagingReader使用方式:

    public static String generateLimitSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String limitClause) {    StringBuilder sql = new StringBuilder();    sql.append("SELECT ").append(provider.getSelectClause());    sql.append(" FROM ").append(provider.getFromClause());    buildWhereClause(provider, remainingPageQuery, sql);    buildGroupByClause(provider, sql);    sql.append(" ORDER BY ").append(buildSortClause(provider));    sql.append(" ").append(limitClause);    return sql.toString();}
    • 这里,limitClause默认为limit 10,每次查询10条记录。

    db索引分区器使用方式:

    • 入参1:表名(如test_table
    • 入参2:索引字段(如id
    • 入参3:主键字段(如id
    • 入参4:分块数量

    分块查询步骤:

  • 统计总数据量:
    select count(1) as countAllNumber from test_table
  • 计算每块的数据量:
    countAllNumber / 4 = 50
  • 分块查询:
    • 第一块:select id from test_table where id > 0 limit 50, 1
    • 第二块:select id from test_table where id > 51 limit 50, 1
    • 依此类推,直到所有数据分块完成。
  • 拼接查询SQL:

    select id from test_table where id > 0 and id < 51 order by id

    总结

    通过以上方法,可以有效提升MySQL深度分页的性能。选择合适的方法取决于具体的业务需求和数据结构。无论是前端控制、记录最大ID、使用IN子句、join方式,还是db索引分区器,都可以根据实际情况进行优化。

    转载地址:http://nfbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>