当前位置: 首页 > news >正文

研发线上事故风险解读之数据库存储

专业在线打字练习平台-巧手打字通,只输出有价值的知识。

一 前言

本文继续基于《线上事故案例集》,进一步深入梳理线上事故数据存储方面的问题点,重点关注数据库存储在使用和优化过程中可能出现的问题,旨在为读者提供具有实践指导意义的专业见解与思考。

我们的微服务架构通过无状态设计和拆分,已经成功实现了服务的横向扩容,特别是在潮汐服务的引入后,这一扩容操作变得更加高效和便捷。然而,在数据库层面(特别是MySQL),实现扩容却面临诸多挑战。

一条不当的SQL语句,就有可能对整个表乃至整个数据库造成灾难性的影响,这种风险不容忽视。尽管我们可以通过分库分表等策略来缓解数据库的扩容压力,但这些方法不仅技术难度大,而且成本也相当高。

因此,我们必须正视数据库有限承载能力(如连接数、CPU、内存等)的现实问题,投入更多的精力进行重点保护。这意味着我们需要不断优化数据库性能,提升SQL语句的执行效率,同时积极探索更加高效、低成本的数据库扩容方案,以确保微服务架构的稳定性和可扩展性。

二 性能极致

在数据库优化的道路上,我们不能仅仅满足于“能用就行”的初级标准,而应秉持追求极致的精神,不断挖掘潜力,提升效率。一个看似微不足道的查询优化,可能仅仅减少了10毫秒的响应时间,但在高并发场景下,若该查询被频繁执行,其累积的效益将是惊人的。例如,若有1千万次的请求,这一微小的优化便能节约高达27个小时的时间成本,这对于提升业务处理速度和用户体验而言,无疑是巨大的提升。

接下来,我们以一个实际案例来具体说明如何在SQL查询中追求极致的优化。

业务场景:在业务处理过程中,我们经常需要根据一个或多个条件来查询是否存在记录,而并不关心记录的具体数量。

很多开发者可能会采用如下的SQL查询语句:

SELECT count(*) FROM table WHERE a = 1 AND b = 2;

这种写法虽然能够完成任务,但存在效率问题。因为count(*)会计算满足条件的记录总数,这通常需要遍历整个表或索引,即使我们并不关心这个总数。

为了提升查询效率,我们可以改用如下的优化写法:

SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1;

在这个优化后的查询中,我们不再使用count函数,而是直接查询满足条件的任意一条记录(通过SELECT 1表示我们只关心记录的存在性,而不关心记录的具体内容)。同时,LIMIT 1限制了查询结果的数量,确保数据库在找到一条满足条件的记录后立即返回,无需继续查找其他记录。

这种优化方法不仅减少了数据库的查询负担,还显著提升了查询速度,特别是在处理大量数据时,其效果尤为明显。

综上所述,数据库优化需要我们从细微处着手,不断追求极致。每一个小小的优化,都可能带来意想不到的收益。因此,在开发过程中,我们应始终保持对性能优化的敏感性和积极性,不断挖掘潜力,提升系统的整体性能。

三 动态调优

SQL执行计划是数据库管理系统(DBMS)用于执行特定查询的一组步骤和策略。然而,这个执行计划并非一成不变,它会受到多种动态因素的影响,如表结构的调整、请求量的增减、记录数的变化等。因此,之前经过优化的SQL语句,在条件发生变化后,可能就不再适用,需要重新进行评估和优化。
在业务场景中,我们经常需要根据特定条件进行数据筛选。例如,执行如下查询语句:

SELECT * FROM t WHERE insert_time > '2024-10-11';

为了提高查询效率,我们可能会在insert_time字段上添加索引,并且该索引在初始阶段是有效的。然而,当业务需求发生变化,需要将部分其他历史数据同步到这个表中时,问题就可能出现了。因为此时,如果查询的数据量接近或超过全表的25%,数据库可能会认为使用索引的性价比不高,从而选择全表扫描。

值得注意的是,我们不能仅凭查询语句中包含了主键(primary key)或索引字段就断定查询一定会走索引。实际上,是否使用索引还取决于数据库对查询成本的评估,这包括需要扫描的行数等因素。在上面的例子中,如果row中扫描的行数等于表的总行数,那么查询速度并不会因为索引的存在而加快,反而可能会因为全表扫描而变慢。

优化策略

  • 定期审查执行计划:随着数据量和查询条件的变化,定期使用数据库提供的工具(如EXPLAIN)审查SQL语句的执行计划,以确保其仍然高效。
  • 动态调整索引:根据查询需求和数据量的变化,动态添加、删除或重建索引。例如,当历史数据同步导致查询数据量大幅增加时,可能需要重新评估索引策略。
  • 优化查询语句:避免使用SELECT *等可能导致全表扫描的查询语句,而是明确指定需要查询的字段。同时,合理利用数据库的优化器提示(hints)来引导查询执行计划的选择。
  • 分区与分片:对于数据量特别大的表,可以考虑使用分区或分片技术来减小单个查询的扫描范围,从而提高查询效率。

综上所述,SQL执行计划的动态性要求我们在数据库优化过程中保持持续的关注和调整。通过定期审查执行计划、动态调整索引、优化查询语句以及采用分区与分片等技术手段,我们可以确保SQL查询在不同条件下都能保持高效运行。

四 实践经验

在数据库稳定性维护的进程中,个人的数据安全保护意识扮演着至关重要的角色。这种意识的形成,离不开对数据库专业知识的深入理解和掌握。为此,我们精心编制了一套SQL规范指南,旨在通过揭示常见的潜在问题点,帮助大家规避风险,确保数据库的稳定运行。

以下是关键的优化建议:

  • 严格管理数据库连接数:
    建议将数据库的连接数控制在2500个以内,以避免因连接数过多而导致的性能瓶颈和资源耗尽问题。
  • 合理控制数据库表的数据量:
    建议将单个数据库表的数据量控制在1000万条以内(取决于硬件资源,数据文档大小等因素),以确保查询和更新操作的效率。当数据量接近或超过这一阈值时,应考虑进行分表或归档处理。
  • 以长远视角设计表结构:
    在设计表结构时,应充分考虑未来的数据增长趋势。例如,对于订单号等字段,应预估其未来的位数增长情况,并选择合适的数据类型(如long类型而非int类型)以容纳更大的数值范围。
  • 谨慎使用多表关联查询:
    在重要系统中,原则上应避免使用多表关联查询,以减少查询的复杂性和执行时间。如果必须使用关联查询,应确保关联条件明确且高效。
  • 合理规划归档操作:
    归档操作应在业务低峰期进行,以减少对正常业务的影响。同时,归档后的数据应妥善保存,以便后续查询和分析。
  • 读写分离与索引优化:
    通过读写分离来分散数据库的读写压力,提高系统的并发处理能力。同时,应充分利用索引来提高查询效率,但需注意避免过度索引导致的性能问题。此外,运营端的like等操作应尽量避免,因为它们可能导致全表扫描,从而降低查询性能。
  • 审慎评估SQL修改的影响:
    在进行SQL修改之前,应充分评估其对线上环境的影响。如果不确定修改的影响,可以请求同事的帮助或提前进行压力测试,以确保修改的安全性和有效性。

通过遵循上述优化建议,我们可以有效提升数据库的稳定性和安全性,为业务的持续发展提供坚实的支撑。

相关文章:

研发线上事故风险解读之数据库存储

专业在线打字练习平台-巧手打字通,只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》,进一步深入梳理线上事故数据存储方面的问题点,重点关注数据库存储在使用和优化过程中可能出现的问题,旨在为读者提供具有实践指导…...

react hooks中在setState后输出state为啥没有变化,如何解决

在 React Hooks 中,setState 的概念被 useState 或 useReducer 钩子所替代。与类组件中的 setState 一样,这些钩子也是异步更新状态的。因此,如果你尝试在调用 setState(即 setXXX 函数)后立即读取状态值,你…...

C++设计模式——代理模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器,能够接收客户端的请求,并代表客户端向服务器发起请求,然后将服…...

docker 复制文件,清除不再使用数据导出以及导出文件系统

docker cp -a centos :/etc/centos-release #将容器内文件复制到宿主机 docker cp /etc/issue centos:/root #将宿主机文件复制到容器内 docker export: 将一个运行的或者挺值得容器的文件系统导出为一个tar归档文件。需要注意,docker export 不会包含该…...

【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例

上篇文章:【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日10点23分 文章目录 Vue 3.0中…...

【第三版 系统集成项目管理工程师】第17章 法律法规和标准规范

持续更新。。。。。。。。。。。。。。。 【第三版】第17章 法律法规和标准规范 17.1法律法规17.1.1 法与法律 P5801.基本概念-P5802.本质与特征-P580 17.1.2 法律体系1.世界法律体系(非重点)-P5802.中国特色社会主义法律体系-P581 17.1.3 法的效力1.对象效力-P5822.空间效力-…...

安装 LLM 编程工具 cursor

1,网址 cursor.com 点击 Download for Free 下载安装包 下载到一个300KB的安装压缩包,解压后双击后,点 open 安装过成会下载真正的应用程序 点击 continue 登陆 比如选择使用 github账号登陆 则会弹出如下网页: 先登陆 github&a…...

Java链式编程的定义、例子、使用方法、实际应用场景、自动装配构造

链式编程(Fluent Interface)是一种编程风格,允许通过方法调用连接在一起进行操作,通常用于提高代码的可读性和简洁性。在 Java 中,链式编程常通过返回 this(当前对象)来实现。这种做法在构建器模…...

用 Git Stash 临时保存修改,轻松切换任务!

在开发过程中,我们经常会遇到这样的情况:正在写代码,突然领导或同事让你赶紧处理一个紧急 bug,但你当前的代码还没写完,不能提交,这时候该怎么办呢?别慌,Git 的 stash 命令正好能帮上…...

Android 下通过触发 SIGTRAP 信号实现反调试

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表 Linux 信号是一种用于进程间通信(IPC)和异常处理的机制。以下是详细的 Linux 信号列表,包含信号名…...

【MySQL】 表的增删操作

目录 1.Create(增) 1.1.单行数据 全列插入 1.2.多行数据 指定列插入 1.3.插入否则更新 1.4.替换数据(REPLACE) 2.Delete(删) 2.1.删除表中的某个条目 2.2.删除整张表数据 2.3.截断表 1.Create…...

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?

随着生物信息学在科研和教育中的快速普及,越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而,在面对这些大规模数据时,个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼? 这篇文章将为你提…...

20255 - 中医方剂学 - 考研 - 执业

第1章 总论 1.我国现存最早的记载方剂的医书是()( ) [单选] A.《太平圣惠方》 B.《黄帝内经》 C.《五十二病方》 D.《千金要方》 E.《外台秘要》 正确答案: C 2.我国最早的中医经典理论著作是()( ) [单选] A.《伤寒杂病论…...

【Vue.js设计与实现】第三篇第9章:渲染器-简单Diff算法-阅读笔记

文章目录 9.1 减少 DOM 操作的性能开销9.2 DOM 复用与 key 的作用9.3 找到需要移动的元素9.4 如何移动元素9.5 添加新元素9.6 移除不存在的元素 系列目录:【Vue.js设计与实现】阅读笔记目录 当新旧vnode 的子节点都是一组节点时,为了以最小的性能…...

服务器软件之Tomcat

服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提:2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…...

Flutter包管理(三)

1、作用 在APP的实际开发过程中往往会依赖很多包,而这些包之间存在着交叉依赖、版本依赖,由开发者自己管理手动管理会非常麻烦,每种开发生态或编程官方会提供一些包的管理工具,在Flutter中我们在pubspec.yaml文件中来管理第三方依…...

CGNS资料

CGNS数据文件 资料 CFD General Notation System CGNS Converters vtkCGNSReader cgnsToFromFoam Example Computer Codes 8.1.2. CGNS Mesh Format and Multizone Interface Connectivity 8 Multizone Interface Connectivity pyvista.cgnsreader CGNS for MATLAB and Octave…...

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文:Deep Residual Learning for Image Recognition   论文链接:Deep Residual Learning for Image Recognition   代码链接:Github 1.介绍 在ResNet网络提出之前,传统的卷…...

Dubbo 序列化方式

Hession 这是dubbo的默认序列化协议,是一种二进制协议,他的特点是序列化的速度比较快,并且序列化的数据体积比较小。Hession适合于大部分场景,因此被选为dubbo的默认序列化协议。 Json Json是一种基于文本的序列化方式&#xf…...

如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践

前言: OceanBase Cloud Platform(简称OCP),是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中,OCP的安装通常是第一步,先搭建OCP平台,进而依赖OCP来创建、管理和监控我们的生…...

15.JVM垃圾收集算法

一、垃圾收集算法 1.分代收集理论 分代收集理论是JAVA虚拟机进行垃圾回收的一种思想,根据对象存活周期的不同将内存分成不同的几个区域;一般将JAVA堆内存分为新生代和老年代;根据每个分代特点选择不同的垃圾收集器; 在新生代中&am…...

软件工程:图书管理系统甘特图

1 实验目的 熟悉GanttProject 软件环境,能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…...

视频的编解码格式

文章目录 视频的编解码格式概念术语视频处理流程视频封装格式视频编码格式视频编解码器,视频容器和视频文件格式之间的区别补充视频码率 参考资料 视频的编解码格式 概念术语 两大组织主导视频压缩的组织及其联合(joint)组织 ITU-T(VCEG) ITU-T的中文名称是国际电信…...

网络资源模板--Android Studio 实现简易新闻App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易新闻App 二、项目测试环境 三、项目详情 登录页 用户输入: 提供账号和密码输入框,用户可以输入登录信息。支持“记…...

LabVIEW提高开发效率技巧----离线调试

离线调试是LabVIEW开发中一项重要的技巧,通过使用Simulate Signal Express VI生成虚拟数据,开发者能够有效减少对实际硬件的依赖,加速开发过程。这种方法不仅可以提高开发效率,还能降低成本,增强系统的灵活性。 ​ 离…...

6N137S1取反电路图

文章目录 一、前言二、6N137S1性能介绍三、应用电路图 一、前言 在硬件电路设计中需要用到隔离电路,但此引脚输出为WS2812的信号,频率有840khz,所以需要使用逻辑光耦,选用6N137S1光耦,速率能达到10Mhz,能满…...

Nullinux:一款针对Linux操作系统的安全检测工具

关于Nullinux Nullinux是一款针对Linux操作系统的安全检测工具,广大研究人员可以利用该工具针对Linux目标设备执行网络侦查和安全检测。 该工具可以通过SMB枚举目标设备的安全状况信息,其中包括操作系统信息、域信息、共享信息、目录信息和用户信息。如…...

学会这 5 个 AI 神器做字体设计,保证让你私单接到爆!

最近我在浏览 AI 绘画的相关内容时,发现不少图像都是与字体相关的,而且其中一些呈现出的艺术特效很是让人眼前一亮。 放在之前,我们需要掌握一些专业技能、并花费大量时间才能设计出精致酷炫的艺术字,但是现在却可以轻松用文本直…...

《Vue3 踩坑》expose 和 defineExpose 暴露属性或方法注意事项

选项式写法 使用 选项式API - 状态选项 - expose 一定要注意: 接下来,进一步看示例说明: 设置 expose 仅显示列出的属性/方法才能被父组件调用;代码第 2 行,父组件可访问属性 a 和 方法 myFunc01,不可访…...

10.13论文阅读

通过联合学习检测和描述关键点增强可变形局部特征 摘要 局部特征提取是计算机视觉中处理图像匹配和检索等关键任务的常用方法。大多数方法的核心理念是图像经历仿射变换,忽略了诸如非刚性形变等更复杂的效果。此外,针对非刚性对应的新兴工作仍然依赖于…...