博客
关于我
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中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>
    MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
    查看>>
    MySQL中的GROUP_CONCAT()函数详解与实战应用
    查看>>
    MySQL中的IO问题分析与优化
    查看>>
    MySQL中的ON DUPLICATE KEY UPDATE详解与应用
    查看>>
    mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
    查看>>
    mysql中的undo log、redo log 、binlog大致概要
    查看>>
    Mysql中的using
    查看>>