Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为什么我们需要批量操作?

为什么我们需要批量操作?

作者头像
出其东门
发布于 2020-09-14 07:35:23
发布于 2020-09-14 07:35:23
92200
代码可运行
举报
文章被收录于专栏:01二进制01二进制
运行总次数:0
代码可运行

背景

实习的时候被问过一个问题,为什么 redis 会有 pipline,mysql 会有 batch,这些东西都具有批量操作的共性,是什么原因让我们在处理数据时需要批量操作?

这么说可能有些抽象,举一个和 API 调用有关的例子 ?:

现有三个服务 service A、service B 和 service C。因业务需要,我们需要在 service A 中调用 service B 获取一组 id,然后根据 id 从 service C 中读取最终内容。然后组织成结果返回前端。由于 service C 只提供了单个 id 查询内容的 API,所以如果我们想要获取批量的信息,最先想到的办法是通过 for 循环多次调用 service C。但是这样的办法是极其不优雅的,接下来我们从以下两个方面来分析。

网络通信

鉴于现在的分布式架构,每个 service 都分布在不同的服务、不同的机器中,所以我们每次调用都要通过 RPC 来实现,这就要求我们不得不构造同等数量的请求来获取数据。这样就会导致了一些效率问题。如下图所示:

所以我们通常会通过在 service C 中提供一个批量查询的接口来解决多次通信的问题。如下图所示 ?

我们知道,并不是每一次网络传输都非常稳定,中途可能会遇到丢包等一系列问题,而用批量查询代替 for 循环单个查询,这样做的好处是,我们可以减少网络通信的次数,一定程度上可以增加整个系统的健壮性。

数据查询

解释完多次 rpc 调用可能造成的网络延迟的问题后,我们再往深一点的地方看。

一般情况下,数据都是存放在数据库中的,所以无论是单个查询还是批量查询,我们最终都是要访问到数据库的。

现假设,我们需要从数据库中查询一个 id 为 123 的用户信息,我们可以用类似下面这样的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long id = 123;
Person p = serviceA.getPersonById(id);

那如果我们需要查询一组 id 为 123、456、789 的用户信息,在没有批量查询接口的情况下,我们可以用 for 循环的方式实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long[] ids = {123,456,789};
List<Person> ps=new ArrayList<>();
for(long id : ids){
    ps.add(serviceA.getPersonById(id));
}

这么看虽然符合逻辑,但在数据库查询时,会有一定的性能损耗。

以 MySQL 为例,不论是 MyISAM 存储引擎还是 InnoDB 存储引擎,锁这个概念一直都是贯穿其中的,MyISAM 存储引擎默认是使用表锁,InnoDB 存储引擎默认使用的是行锁,这就意味着,在查询数据时,mysql 会将相关记录“锁起来”,只有当结果查询完毕时才会释放锁。

相较于批量查询只有一次上锁、开锁这种情况,循环里的每次查询都要先拿到锁,然后再释放锁,这个操作自然会更加耗时。这也就是为什么 mysql 会提供 batch 操作的原因。

Redis 中的 pipline

这里我们再来扩展一下,为什么 redis 中会需要 pipline 这样一种实现机制。

pipline,中文翻译为管道,它可以将一组 redis 命令进行封装,一次性将多个命令传输到 redis 服务端,并将数据一次性带回。这样就可以通过一次 RTT (Round Trip Time 往返时间),将多个数据带回,减少了数据传输的 RTT 消耗。如下图所示 ?

redis 的命令执行是微妙级别的,这个速度相对于网络延时是非常小的,因此才有了 redis 的性能瓶颈在网络的说法。并且事实上网络确实已经是 redis 的性能瓶颈之一。

这就更凸显了批量操作的重要性了。

最后

回到这一篇的主题,为什么我们需要批量操作?

虽然现在已经是“云”的时代,在云内部的 rpc 请求几乎不消耗时间,但我们仍然需要意识到构造请求、解析请求、查询数据库等方面的时间和资源消耗。

如果不能批量操作,那么,需要操作的资源越多,操作执行的次数也会越多。这是一个线性上升的模型。就像数据库导入数据,一条两条,手写个 sql 完全没问题。那如果是,100 万+数据呢?一条一条手动导入?这显然是不合理的。

这就是批量操作的现实意义。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 01二进制 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【大长文】7大领域,50道经典题目,助你彻底搞定MySQL面试!
开发人员必备的9大MySQL索引和查询优化一般来说,程序员的面试内容分为两部分,一部分与编程相关,另一部分则与数据库相关。而作为数据库中的主流,MySQL更是涉及面试中的诸多高频考点。对于后端人员来说,不需要像专业的DBA那样精通MySQL,但也需要掌握相关的基本内容。小编在此总结了MySQL面试中常见7大领域的50道经典面试题,以期帮助大家顺利通过面试。
田维常
2019/12/25
7880
【大长文】7大领域,50道经典题目,助你彻底搞定MySQL面试!
从Mysql架构看一条查询sql的执行过程
首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。
架构狂人
2023/10/26
2880
从Mysql架构看一条查询sql的执行过程
MySQL存储引擎介绍
  首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点。  
changxin7
2022/05/06
1.2K0
MySQL存储引擎介绍
Jedis客户端以及redis中的pipeline批量操作
前面的章节介绍了redis的安装、还有命令配置等内容,我们在实际使用时大部分情况都是利用现成的Java客户端对redis进行操作。当然命令并不是没用,它极有可能在你排查问题时排上用场,因为你有可能会直接连入redis服务端通过命令行来排查是否是redis缓存的问题。
用户1148394
2020/02/26
4.6K0
阿里终面:10亿数据如何快速插入MySQL?
最快的速度把10亿条数据导入到数据库,首先需要和面试官明确一下,10亿条数据什么形式存在哪里,每条数据多大,是否有序导入,是否不能重复,数据库是否是MySQL?
搜云库技术团队
2023/10/30
2.7K0
阿里终面:10亿数据如何快速插入MySQL?
❤️爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】❤️
数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库 专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方式对象数据进行管理更加的方便,快速,安全
不吃西红柿
2022/09/19
6250
❤️爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】❤️
可能是全网最好的MySQL重要知识点
MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。
纯洁的微笑
2019/09/19
4230
可能是全网最好的MySQL重要知识点
《面试集:自用》《待完善...》
02、java7中的基本设计理念就是切分成多个Segment块,默认是16个,也就是说并发度是16,可以初始化时显式指定,后期不能修改,每个Segment里面可以近似看成一个HashMap,每个Segment块都有自己独立的ReentrantLock锁,所以并发操作时每个Segment互不影响;
2020/11/12
4970
《面试集:自用》《待完善...》
为什么阿里巴巴规定禁止超过三张表 join?
本周赠书《性能之巅》第2版 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join),而PG是都支持的,而且mysql是往简单化方向去设计的,如果多个表关联查询(超过3张表)效率上是比不上PG的。 1. 摘要 不超过3层是为了效率。 更通用 ,更好为了分布式做准备。 下面也对mysql多表关联这个特性简单探讨下~
程序猿DD
2022/07/18
1.3K0
为什么阿里巴巴规定禁止超过三张表 join?
如何通过批量操作提升 redis 性能
由于 redis 事务不满足原子性,并且每条命令都会与服务器进行网络交互,因此,对于整个交互过程而言也并没有性能上的提升,所以在实际的使用中,redis 的事务特性基本上是不会被使用到的。
用户3147702
2022/06/27
1.4K0
如何通过批量操作提升 redis 性能
MySQL性能优化(一):MySQL架构与核心问题
作为程序员的你,数据库作为一门必修课,而MySQL数据库毫无疑问已经是最常用的数据库了。系统的稳定、高效、高并发等指标,很大程度上取决于数据库性能是否够优,可见性能优化的重要性,这也就不难理解各位在任何一场面试中都会被问及到数据库调优相关的问题。
田维常
2020/03/11
6200
[别被脱库系列]1 数据库的初恋
此时小蓝还没有提交这个事务,小林去访问了这个表(小林去年买了个表,哈哈哈嗝),于是
我是程序员小贱
2020/06/04
1.1K0
Mybatis批量操作解析
我们在项目中会有一些批量操作的场景,比如导入文件批量处理数据的情况(批量新增商户、批量修改商户信息),当数据量非常大,比如超过几万条的时候,在Java代码中循环发送SQL到数据库执行肯定是不现实的,因为这个意味着要跟数据库创建几万次会话。即使在同一个连接中,也有重复编译和执行SQL的开销。 例如循环插入10000条(大约耗时3秒钟)∶
向着百万年薪努力的小赵
2022/12/02
1K0
Mybatis批量操作解析
美团面试官:讲清楚MySQL结构体系,立马发offer
继续和大家分享,我去上海美团面试遇到的技术问题,当时,回答的也是马马虎虎的,不能说不好,也不能说好,反正就是没有给面试官一种爽的感觉。
田维常
2021/08/06
4860
MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
一 库操作(文件夹) 1 数据库命名规则 可以由字母、数字、下划线、@、#、$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 2 数据库相关操作 创建库 create database 数据库名 ;    (注意要引号结尾)    (默认latin1) 在创建数据库的时候也可指定编码格式,如: create database 数据库名 charset utf8;  选择数据库 use 数据库名    切换到指定数据库下  查看库 show database
用户1214487
2018/01/24
1K0
干货!MySQL优化原理分析及优化方案总结
说起MySQL优化的话,想必大部分人都不陌生了。在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*、避免使用NULL值的判断、根据需求适当的建立索引、优化MySQL参数......但是你对于这些优化技巧是否真正的掌握了及其相应的工作原理是否吃透了呢?在我们的实际开发过程中你能充分应用到吗?我觉得还有待考察。所以,本文将详细介绍MySQL优化技巧以及其相应的技术原理,希望大家看完以后,能更清楚直接的了解这些优化方案,并应用到我们的工作岗位中。
用户1516716
2020/12/17
9150
数据库篇
SQL 标准定义的四个隔离级别为: read uncommited :读到未提交数据 read committed:脏读,不可重复读 repeatable read:可重读 serializable :串行事物
Li_XiaoJin
2022/06/10
1K0
数据库篇
Mysql全面总结
常见的存储引擎有MyISAM,InnoDB,MEMORY,MERGE.今天我们就分别介绍一下,
小土豆Yuki
2021/03/18
4850
Mysql全面总结
[NewLife.XCode]批量添删改操作(提升吞吐率)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2020)开发完成并维护至今,以下简称XCode。
大石头
2022/05/10
6350
MySQL 数据库设计总结
规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过10
漆洪凯
2016/09/26
7.6K7
推荐阅读
相关推荐
【大长文】7大领域,50道经典题目,助你彻底搞定MySQL面试!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档