百万数据分页查询优化方案

这篇具有很好参考价值的文章主要介绍了百万数据分页查询优化方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分页问题

分页列表查询是项目中的热点需求,这种需求的特点是:字段多、数据量大、访问频繁、使用率高的特点,这个功能是给用户最直观的展示系统的信息,针对于多、大、频、热这几个特点,会引申出一个问题:列表展示的数据可能是来自于不同的数据维度、需要关联N张表查询得到,那么,如何让用户更快、更准的获取到需要的数据,便成了程序员在编码时需要考虑到并且需要解决的问题,因为随时间推移,线上系统不乏几百万数据的表。

准备
CREATE TABLE `test_temp` (
  `test_id` int NOT NULL AUTO_INCREMENT,
  `field_1` varchar(20) DEFAULT NULL,
  `field_2` varchar(20) DEFAULT NULL,
  `field_3` bigint DEFAULT NULL,
  `create_date` date DEFAULT NULL,
  PRIMARY KEY (`test_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

写一个存储过程生成200万测试数据:

drop procedure if exists test_insert;
create procedure test_insert(n int)
begin
    declare v int default 0;
    SET AUTOCOMMIT = 0;
    while v < n
        do
            insert into test_temp(field_1, field_2, field_3, create_date)
            values (concat('testing',v),
                    substring(md5(rand()), 1, 10),
                    floor(rand() * 1000000),
                    adddate('1970-01-01', rand(v) * 10000));
            set v = v + 1;
        end while;
    SET AUTOCOMMIT = 1;
end;

插入数据:

call test_insert(2000000);

测试数据方案来自于:

https://blog.csdn.net/weixin_38924697/article/details/119978916

现象

带分页的语句,我们一般使用Limit实现,那么基于以上数据我们写一个SQL:

SELECT * from test_temp LIMIT 1,10

执行时间:0.004秒

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库此时,我们模拟分页数据特别往后的情况,分页数据越往后越慢。

SELECT SQL_NO_CACHE * from test_temp LIMIT 19999900,10

执行时间:1.348秒,速度慢了二十余倍。

实际的业务场景下,可能会关联N张表,而且线上服务器的压力会比单机开发环境更重,因此实际接口响应时间会更长。

问题原因
  1. 回表:查询频率高的字段会建立索引,但是并不是所有的查询字段都会在索引上,无法命中索引的字段则需要回表,回表是IO操作,因为需要根据索引查找到数据行后,再根据数据行的主键或唯一索引去聚簇索引中查找具体的数据行。因此在执行回表操作时需要从磁盘读取数据,而磁盘IO是相对较慢的操作。
  2. 查询规则:limit 19999900,10并不是从第19999900行开始扫描,使用explain查看执行计划:百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库
解决方案

当查询的字段都被索引覆盖时,可无需回表,那么我们可以先查询出主键id,再根据主键id拼接id条件或者作为临时表JOIN原表就可以了。因为主键id是最快的索引:聚簇索引,通过id就能快速找到指定行。

查询方案一:

先查询出id,再根据id直接查询数据。

查询出id
SELECT test_id from test_temp LIMIT 1999995,5

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

执行计划:

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

再根据这些id为条件查询数据
SELECT * from test_temp WHERE test_id in (2952993,2952995,2952996,2952997)

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

优化后的查询时间为:0.002秒。

执行计划

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

查询方案二:

使用子查询作为临时表Inner join主表查询:

SELECT * from (SELECT test_id from test_temp LIMIT 1999995,5) as temp INNER JOIN test_temp tt on tt.test_id = temp.test_id

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

整体查询时间:0.245秒

执行计划:

百万数据分页查询优化方案,笔记,思考,MySQL,java,数据库

性能对比

在不考虑MySQL执行时校验权限、建立连接的情况下,两种方案整体查询时间在0.25秒左右,相比于整体查询的1.34秒具有较大优势。方案一相较于方案二的SQL语句更加简洁易懂,而方案二只需与MySL建立一次查询即可。

其他优化项

请参考:

百万查询注意点文章来源地址https://www.toymoban.com/news/detail-605879.html

到了这里,关于百万数据分页查询优化方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL分页查询详解:优化大数据集的LIMIT和OFFSET

    最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但每个工单都包含了大量的信息。DBA进行了多次导出操作,

    2024年02月10日
    浏览(52)
  • 【性能优化】MySql数据库查询优化方案

    了解系统运行效率提升的整体解决思路和方向 学会MySQl中进行数据库查询优化的步骤 学会看慢查询、执行计划、进行性能分析、调优 ​关于这个问题,我们通常首先考虑的是硬件升级,毕竟服务器的内存、CPU、磁盘IO速度 、网络速度等都是制约我们系统快慢的首要因素。硬

    2024年02月03日
    浏览(59)
  • Mysql如何优化数据查询方案

    mysql做读写分离 读写分离是提高mysql并发的首选方案。 Mysql主从复制的原理 mysql的主从复制依赖于binlog,也就是记录mysql上的所有变化并以二进制的形式保存在磁盘上,复制的过程就是将binlog中的数据从主库传输到从库上。 主从复制过程详细分为3个阶段: 第一阶段:主库写

    2024年02月21日
    浏览(45)
  • java使用jdbcTemplate查询并插入百万级数据解决方案

    背景:使用JdbcTemplate查询500万数据,然后插入到数据库。 这么多的数据按照普通的方式直接查询然后插入,服务器肯定会挂掉,我尝试过使用分页查询的方式去进行分批查询插入,虽然也能达到保证服务器不挂掉的效果,但是有一个严重的问题,每次查询的数据很难保证顺序

    2024年02月03日
    浏览(45)
  • oracle 大数据常见优化 &分页查询

    参考某微信社区博主,此文为温故知新;原参考博主账号与链接已丢失 1.limit 语句样式:select * from table limit m,n 适用场景:适用于数据量较少的情况(元组、百/千) 缺点:全表扫描,速度劣势,有的数据库结果集返回不稳定。limit限制是从结果集的M位置处取出N条输出,其余

    2024年02月05日
    浏览(41)
  • 千万级数据深分页查询SQL性能优化实践

    如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系;并对外提供各种关系查询,比如查询用户的关注商品或店铺列表,查询用户是否关注了某个商品或店铺等。但是最近接到了一个新需求,要求提供查

    2024年02月11日
    浏览(59)
  • 重构优化第三方查询接口返回大数据量的分页问题

    # 问题描述      用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~      1、经排除是调用第三方数据量达10w条响应会超时,数据没正常返回      2、现有线上缓存分页也是加载慢数据不能正常展示      3、第三方接口返回类似报文jsonj:           4、我

    2024年02月09日
    浏览(47)
  • MySQL查询优化方案汇总(索引相关)

    类型隐式转换 大坑 大数据深度分页,用主键 避免使用MySQL函数 避免类型的隐式转换 避免使用函数或表达式,尽量只让数据库做纯粹的增删改查。 避免使用不等值做排除法 避免使用null值 减少大字段查询,避免使用*,不说磁盘io的损耗,连网络带宽都跟着损耗。 如果只sel

    2024年03月09日
    浏览(49)
  • mysql 模糊查询like优化方案(亲测)

    本文的测试是基于 740w条 测试数据进行的,只讨论like模糊查询的优化方案。其他SQL优化可参考: SQL优化的几种方式 查询开头是“今天不开心”的聊天记录,是可以走索引的。 查询包含“今天不开心”的聊天记录,是不能走索引的。 咱们主要优化的是第二种情况,我本人测

    2023年04月08日
    浏览(89)
  • mysql mybatis分页查询 大数据量 非常慢

     查阅了很多博客和资料,这篇文章以思路为准,详细代码不细说,都是非常简单的方法,一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题:单表数据已经达到4千万条数据,通过mybatis的分页查询效率非常低下。         当然,前提是索引什么的优化已经都

    2024年01月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包