数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮

2024-01-21

数据库 | 面试官:一次到底插入多少条数据合适啊?…面试连环炮

数据库插入操作的基础知识

  • 插入数据是数据库操作中的基础。但是,我们程序员将面临随之而来的问题:????如何快速有效地插入数据,并保持数据库 性能 ?当你向数据库中插入数据时,这些数据直接存储到硬盘上吗?

插入数据的原理

  • 深入了解插入数据时背后发生的事情是优化数据库性能的关键。

写入缓存与磁盘同步

  • 当数据被写入数据库时,它首先应该被写入 缓存 中,而不是缓慢的 磁盘 中。然后 后台线程 在适当的时间点将数据 同步 到磁盘上。
  • 这样做的主要原因有以下几点:
    • 速度差异 :RAM(随机存取存储器)的速度远远快于磁盘。RAM对数据的读写几乎是瞬时的。而磁盘,无论是传统的机械硬盘还是现代的固态硬盘,其读写速度都远慢于 RAM。
    • 磁盘 I/O 的成本 :每次进行磁盘 I/O操作都有一定的开销。如果数据库频繁地进行小批量的磁盘写入,这会导致大量的 I/O 开销,得不偿失哇。
    • 合并写入 :首先将数据写入 RAM,在数据库可以把数据同步到磁盘之前,累积 多个写入操作 。最后一次性将大量数据写入磁盘,从而减少 I/O 操作的次数和开销。
  • 总结 : 总的来说嘛,为了最大化性能,数据库首先将数据写入缓存,并在适当的时间点将这些数据 同步 到磁盘。这种策略不仅加速了写入操作,还有效地减少了磁盘 I/O,提高数据库性能。
  • ????:????那脏页还没有来得及刷入到磁盘时,MySQL 宕机了,数据不就莫得了?
  • ????:这我懂!InnoDB 在进行更新操作时采用了 Write Ahead Log(先写日志)策略。这意味着在数据被写入磁盘之前,相关的操作会首先被记录到 redo log 日志中。这种策略赋予了 MySQL 在系统崩溃后的恢复能力。

事务日志与数据持久化

  • 为了确保数据的完整性,数据库首先将插入操作写入 事务日志 。只有当数据被安全地写入日志后,它才被移动到实际的数据表中。
  • 在这里插入图片描述

数据存储单位:页

  • 操作系统为了管理物理内存和虚拟内存,使用一个称为“页”的结构来管理,说白了其实就是一块固定的连续内存空间而已。这些页有固定的大小,如 4KB、8KB 或 16KB。这个大小一般是块的整数倍。 使用页进行存储有多种优势,如减少磁盘I/O、高效的空间管理以及缓存优化。了解你的数据库页的大小可以帮助你优化插入操作和空间管理!

单条数据与批量数据插入的差异

速度和效率比较

  • 知识点 :我们的业务系统的CUD操作,每次都要伴随着事务开销。如果你在应用中执行单条插入,插入了1000次数据,那么你就有1000次事务开销。而批量插入可以将这些数据在一个事务中插入,大大减少了总的事务开销。 单条插入虽然简单明了,但在大量数据插入时,其性能上的缺陷会逐渐显现。与之相对,批量插入可以显著提高性能,但它也引入了其它问题, 数据的验证 错误处理 变得更为复杂。(鱼与熊掌不可兼得)

对数据库性能的影响

  • 小贴士 :批量插入可以减少磁盘I/O次数,从而提高性能。但是,如果一次插入的数据量过大,它可能会暂时阻塞其他操作,影响数据库的响应时间。 为了达到最佳性能,您可能需要根据实际情况调整批量插入的数据量。过少的数据可能导致性能优化不足,而过多的数据可能导致数据库响应时间增加。
  • ???? :????数据库的锁机制和并发控制策略在插入操作中起到关键作用。如果多个进程或线程试图同时插入数据,可能会发生锁争用,进而影响性能。我们又该如何优化这些机制进一步提高批量插入的性能呢?

如何决定合适的插入数据量?

  • 为了实现数据库的最大效能,确定合适的插入数据量至关重要。但这并不是一项简单的任务,需要考虑多种因素。
  • ???? :????很好啊,能考虑这个说明你有在思考了,那当你决定插入一大批数据时,你通常是如何选择具体的数量的?

考虑硬件和系统资源

  • 在考虑合适的插入数据量时,首先需要考虑的是硬件和系统的限制。

磁盘I/O:

  • 磁盘I/O是插入数据时的主要瓶颈之一。过多的插入操作会导致磁盘I/O饱和,降低系统的响应时间。 ???? 优化建议 :监控磁盘I/O使用情况,确保在高插入量时不超过其峰值

内存使用:

  • 大量的插入操作可能会增加RAM的使用量。如果内存使用接近或达到了系统限制,可能会导致性能下降,甚至导致系统崩溃。
  • 小贴士 :定期检查系统的内存使用情况,确保有足够的可用资源来处理大量的插入操作。

数据库的内部机制

  • 数据库本身也有一些内部机制,这些机制在决定插入数据量时也应该考虑。

事务大小

  • 数据库事务的大小直接影响其性能。较大的事务可能会导致长时间的锁定,从而影响其他查询的性能。
  • 小贴士 :找到合适的事务大小平衡点是提高插入性能的关键。太小的事务可能会增加总的事务数量,而太大的事务可能会导致系统资源的饱和。

锁策略

  • 考虑到数据库的锁策略也很重要。过多的锁争用可能会导致性能下降。 ???? 深入探讨 :优化数据库的锁策略和并发控制可以进一步提高插入性能。

估算插入量

  • 为了进行这个估算,我们首先要确定一条记录的结构。假设我们有以下的记录结构:
  • 整型字段 ( int ): 4 字节
  • 变长字符字段 ( varchar ): 假设平均长度为 50 字节,最大长度为 255 字节
  • 日期字段 ( date ): 3 字节
  • 浮点数字段 ( float ): 4 字节
  • 基于上述的结构,一条记录的平均大小可以估算为:
  • 记录大小=4+50+3+4=61字节
  • 为了考虑到某些记录可能使用 varchar 的最大长度,我们也可以计算最大记录大小:
  • 最大记录大小=4+255+3+4=266字节

内存分析:

  • 假设给定 8G 内存,并且预留 20% 的空间,我们可以使用的内存为:
  • 可用内存=0.8×8G=6.4G
  • 由此,我们可以存储的最大记录数为:
  • 最大记录数 (平均大小)=61字节/记录6.4×109字节
  • 最大记录数 (最大大小)=266字节/记录6.4×109字节

硬盘分析:

  • 考虑 512G 硬盘,我们可以存储的最大记录数为:
  • 最大记录数 (平均大小)=61字节/记录512×109字节
  • 最大记录数 (最大大小)=266字节/记录512×109字节

实际应用中的策略与建议:结合MyBatis

使用``标签进行批量插入

  • 在MyBatis的映射文件中,通常使用``标签来进行批量插入。

  • <insert id="insertMultiple" parameterType="list">
        INSERT INTO tableName (column1, column2, ...)
        VALUES
        <foreach collection="list" item="record" separator=",">
            (#{record.column1}, #{record.column2}, ...)
        </foreach>
    </insert>
    
    

ExecutorType.BATCH

  • Mybatis Plus也有相关的批量插入的方法。不过你也可以设置 ExecutorType BATCH 来开启批处理模式。这样,所有的SQL语句都会被积累,直到手动提交或关闭会话。

  • SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
    
  • 使用 BATCH 模式时,MyBatis允许你设置一个 batchSize 。累积到多少数量的SQL语句时,MyBatis就会会将它们批量执行。合理设置 batchSize 可以避免OOM(Out of Memory)问题。一帮情况下,我们项目组就是用这个办法,怕有些新手程序员批量单条插入,导致性能缓慢。

避免频繁的会话提交

  • 在批量插入期间,频繁提交会话可能会导致性能下降。一般在插入完所有数据后再进行一次会话提交。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮 的相关文章

随机推荐

  • 图片翻译在线怎么用?分享翻译软件给你

    作为一个不擅长学习语言的人 我真是要被生活中似乎无处不在的英语搞蒙了 想象一下 你正在逛商场 想买一瓶洗护用品 拿起来却看到商品上满是看不懂英文说明 是不是一头雾水 或者 你在浏览社交媒体时 看到一张充满英文的趣味图片 却因为语言障碍而错过
  • 挖掘知识的宝藏:如何利用在线资源提升个人技能

    在这个信息爆炸的时代 互联网已经成为我们获取知识 提升技能的重要途径 无论是学习编程 提高语言能力 还是了解新的行业趋势 网络资源都为我们提供了无限可能 本文将探讨如何有效利用在线资源进行自我提升 一 选择合适的在线学习平台 首先 我们需要
  • 电脑操作系统的发展史:从初级到高级的演变

    自电脑诞生以来 操作系统作为其重要组成部分 不断推动着电脑技术的进步与发展 本文将带您回顾电脑操作系统的发展历程 探究其在不同阶段的特点与影响 一 早期操作系统 真空管与批处理 在电脑诞生初期 真空管技术占主导地位 此时的操作系统尚未形成完
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • 鸿蒙开发Flex、栅格布局详解

    Flex弹性布局 一 direction 1 FlexDirection Row 主轴为水平方向 子组件从起始端沿着水平方向开始排布 2 FlexDirection RowReverse 主轴为水平方向 子组件从终点端沿着FlexDirec
  • 独家 | 鸿蒙(HarmonyOS)开发详细学习笔记免费分享

    前言 华为宣布 将在1月18日 在北京 上海 杭州 南京 成都 厦门 武汉 长沙 8 大城市同时召开大会 届时将揭秘鸿蒙生态和 HarmonyOS NEXT 进阶新篇章 简单的来说就是 纯血鸿蒙系统 即将彻底揭晓 鸿蒙系统自推出来以来 就一
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • 会议设备:提升会议体验与效率的关键

    在当今高度信息化的社会 会议已成为企业 机构和团队之间交流与合作的重要方式 而会议设备的选择与使用 对于提升会议的体验与效率具有举足轻重的地位 本文将详细探讨会议设备的重要性 以及如何选择和使用合适的会议设备 以实现高效 顺畅的沟通 首先
  • Android Studio Android Flutter问题记录 - UNABLE TO FIND BUNDLED JAVA VERSION

    前言 有个紧急问题需要修复 本以为很快就能解决继续休假 没想到项目打开运行后Android端跑不起来了 iOS端正常运行 这就有点莫名其妙 明明放假前还是没问题的 难道我拉取的最新代码有问题 不会吧 谁放假还敲代码啊 樂 看了下最新的提交记
  • 30天精通Nodejs--第二十二天:express-认证和授权

    目录 引言 理解JWT及其工作原理 安装与引入JWT库 生成JWT令牌 验证JWT令牌 注意事项与最佳实践 结语 引言 在现代Web应用开发中 JSON Web Tokens JWT 作为一种轻量级 自包含且安全的标准 已被广泛用于实现用户
  • Kubernetes (十一) 存储——Secret配置管理

    一 简介 从文件创建 echo n admin gt username txt echo n westos gt password txt kubectl create secret generic db user pass from fi
  • AI在保护环境、应对气候变化中的作用

    对于AI生命周期数据领域的全球领导者而言 暂时搁置我们惯常的AI见解和AI生命周期数据内容产出 来认识诸如世界地球日这样的自然环境类活动日 似乎是个奇怪的事情 我们想要知道 数据是否真的会影响我们的地球环境 简而言之 是 确实如此 但作为一
  • 数据加密保障数据安全

    一 目标 1 1 预研需求 数据加密是安全领域中常用的安全措施 它们的主要作用是保护数据的机密性和完整性 以防止未经授权的访问 窃取 篡改或泄漏敏感信息 数据传输加密 保护敏感数据在传输过程中的安全 当数据通过网络传输时 它们可能会经过多个
  • AI在广告中的应用——预测性定位和调整

    营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前 从而增加他们购买的可能性 随着时间的推移 营销人员能够深入挖掘越来越精准的客户细分市场 他们不仅具备了实现上述目标的能力 而且这种能力还在呈指数级提升 在AI技术帮助下 现在的营销
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

    JVM优化之 Xss Xms Xmx Xmn 参数设置 XmnXmsXmxXss有什么区别 Xmn Xms Xmx Xss都是JVM对内存的配置参数 我们可以根据不同需要区修改这些参数 以达到运行程序的最好效果 Xms 堆内存的初始大小 默
  • 图片编辑软件有哪些好用的?这几款快收藏吧

    你有没有过这样的经历 精心拍摄了一组照片 却发现有些角度不对 光线不够好 或者想要给图片加上一些特别的滤镜效果来达到心目中的样子 这时 你就需要一款合适的图片编辑软件了 但是 市面上的图片编辑软件琳琅满目 哪一款才是适合自己的呢 别担心 今
  • 30天精通Nodejs--第二十一天:express-依赖注入

    目录 引言 Express中的模块化实践 依赖注入 什么是依赖注入 Express中实现依赖注入 结语 引言 在构建大型且复杂的Node js Express应用程序时 良好的架构设计至关重要 模块化编程可以帮助我们把代码分解为可复用 易维
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • 数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮

    数据库 面试官 一次到底插入多少条数据合适啊 面试连环炮 数据库插入操作的基础知识 插入数据是数据库操作中的基础 但是 我们程序员将面临随之而来的问题 如何快速有效地插入数据 并保持数据库 性能 当你向数据库中插入数据时 这些数据直接存储到