当前位置: 首页 > 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来创建、管理和监控我们的生…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...