博客
关于我
MySQL 深度分页性能急剧下降,该如何优化?
阅读量:794 次
发布时间: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_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>