博客
关于我
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/

    你可能感兴趣的文章
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    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,如何关联查询?
    查看>>