博客
关于我
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 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>
    mysql-5.7.18安装
    查看>>
    MySQL-8.0.16 的安装与配置
    查看>>