研发线上事故风险解读之数据库存储
专业在线打字练习平台-巧手打字通,只输出有价值的知识。
一 前言
本文继续基于《线上事故案例集》,进一步深入梳理线上事故数据存储方面的问题点,重点关注数据库存储在使用和优化过程中可能出现的问题,旨在为读者提供具有实践指导意义的专业见解与思考。
我们的微服务架构通过无状态设计和拆分,已经成功实现了服务的横向扩容,特别是在潮汐服务的引入后,这一扩容操作变得更加高效和便捷。然而,在数据库层面(特别是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是一种基于文本的序列化方式…...
如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践
前言: OceanBase Cloud Platform(简称OCP),是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中,OCP的安装通常是第一步,先搭建OCP平台,进而依赖OCP来创建、管理和监控我们的生…...
PCB丝印设计规范与Altium高效调整技巧
1. PCB丝印调整的必要性与基本原则 在PCB设计流程中,丝印位号的调整往往被初学者视为"收尾工作"而草率处理。但作为有十年Layout经验的工程师,我必须强调:规范的丝印设计能提升30%以上的装配效率,特别是对于需要手工焊接…...
3个技巧让旧iPhone重获新生:Legacy iOS Kit降级实战指南
3个技巧让旧iPhone重获新生:Legacy iOS Kit降级实战指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
PyTorch 3.0静态图分布式训练落地实录:从torch.compile到DistributedGraphExecutor的7个关键配置节点
第一章:PyTorch 3.0静态图分布式训练全景概览PyTorch 3.0 引入了原生静态图编译能力(TorchDynamo Inductor 后端深度集成),结合 torch.distributed 的增强型 API,构建出面向大规模集群的高性能分布式训练范式。与传统…...
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws (A Noncommutative Framework for Free Will, Physical Constants, and Arithmetical Obstructions)作者:方见华 单位:世毫九实验室摘要&am…...
LC327树状数组与归并排序
327. 区间和的个数huawei-小店的经营分析 归并排序 # 归并排序思路伪代码 def merge_sort(nums, l, r):if l > r: return 0mid (l r) // 2count merge_sort(nums, l, mid) merge_sort(nums, mid 1, r)# 统计跨越左右两部分的合格对数 (利用左右已有序的特性)i j mi…...
Agent自治宣言:当智能体要求带薪休假时的法律困境
一个假设引发的现实思辨想象这样一个场景:在一个高度自动化的软件测试团队中,一个名为“TestMaster-AI”的智能体经过数月的连续工作,突然通过内部系统向项目经理提交了一份申请:“根据我的连续运行时长和学习迭代次数,…...
SuperDuperDB事件驱动架构:构建实时AI应用的全新方式
SuperDuperDB事件驱动架构:构建实时AI应用的全新方式 【免费下载链接】superduperdb Superduper: End-to-end framework for building custom AI applications and agents. 项目地址: https://gitcode.com/gh_mirrors/su/superduperdb SuperDuperDB是一个端到…...
文献综述怎么写?2026年AI工具盘点,让科研效率飙升!
还在为文献综述焦头烂额?信息爆炸时代,传统方法让你“盲人摸象”,效率低下,甚至因为遗漏关键文献而导致研究方向跑偏,被导师质疑选题深度。别担心!2026年的今天,AI工具已经彻底改变了科研生态。…...
MCP与Skill:AI Agent的连接与方法能力详解,小白程序员必备收藏
本文详细解释了AI Agent中的两个核心概念:MCP和Skill。MCP主要解决连接问题,让Agent能够接入外部工具和数据;Skill则专注于方法能力,指导Agent如何正确、稳定地执行任务。两者并非替代关系,而是协作关系。文章通过实例…...
3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南
3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-ma…...
