添加一个索引要投产,需要哪些步骤?

2024-05-09 07:36
文章标签 步骤 需要 索引 投产

本文主要是介绍添加一个索引要投产,需要哪些步骤?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

9b834e5454a444fce8f350ee88fc1012.png

编程一生

0db72c1cbe9388745e41c9af0e4be3e0.png

致力于写大家都能看懂的、有深度的

技术文章

05/2024

01

开场白

46ae62bfc7508a5fae596c86ea7b32fd.png

亚马逊有个bar raiser文化。就是说新招来的人一定要超过之前入职人员的平均水平,宁缺毋滥。越来越多的公司在推行这种文化。在这种氛围下:“虽然我不懂,但是活儿是能出来的”这种解决问题型人才也在以飞奔的速度转型为“活儿能,话能说明白”的综合素质人才。

7dca2be972361c7e00dc830dc3063ef4.png

今天咱们就来聊一聊一个简单的添加索引在这个时代要怎样实施。

7d1c0788021a3dcb40b11e9e23e3b32b.png

02

添加普通索引可能引起的问题

尽管添加索引可以优化SQL语句的性能,但是添加索引的同时也会带来不小的开销。尤其是在有大量的索引的情况下。

mysql添加索引造成的影响如下:

  • DML(数据操作语言)影响,在表上添加索引会直接影响写操作性能(因为添加记录的同时还有创建相应记录的索引,这也是要耗资源的)。

  • DDL(数据定义语言)影响,随着表大小的不断增加,对性能的影响也会不断增加。比如:ALTER语句会耗费更多的时间。

  • 磁盘空间的影响,往往在添完一个索引后表占用的空间大小会成倍地增加。

4bee7486a90a6d26ee0a5bab30965358.png

03

新增唯一索引造成数据丢失问题

MySQL目前主要有三种DDL方式,MySQL原生的DDL,pt-osc和gh-ost。从gh-ost和pt-osc的原理上来讲,全量都是通过insert ignore拷贝到新表,然后增量数据通过触发器或者binlog的方式merge到新表中,这样的话在以下三种场景会出现数据丢失:

  • 新加字段,并对该字段添加唯一索引;如果这时候使用 gh-ost 变更,最后只会剩下一条记录

  • 原表存在重复值,如下数据表;如果这时候使用 gh-ost变更,就会丢弃重复记录

  • 改表过程中新写(包含更新)的数据出现重复值,如果这时候使用 gh-ost 变更,在拷贝原表数据期间,可能会覆盖重复数据

方案

是否丢数据

建议

原生
ONLINE

DDL 不丢数据适合小表,及对从库延迟没要求的场景

pt-osc

可能丢数据,无辅助功能可以避免丢数据的场景不适合添加唯一索引
gh-ost可能丢数据,有辅助功能可以避免部分丢数据的场景适合添加唯一索引

4333c553d8356ac7ecb8b3f248c0a756.png

04

添加索引投产前要怎样做

测试环境充分验证

添加索引前备份,在索引后,将数据与备份数据进行比对,确保数据符合预期。

观察添加索引的耗时,准确评估对生产环境的影响。

投产前通知并制定紧急预案

通知DBA和所有使用此数据库的团队和其他相关团队。DBA在添加索引前先备份,一旦出现问题可立即回滚。

投产时

业务低峰期进行变更降低业务影响。密切观察监控,做好回滚准备。

75bf259fd037aba3d86943c5e8d6ff98.png

05

总结

之前遇到过一个开发小哥哥修改了MQ的一个参数,这个参数的作用是:在消费消息时,原本线程来获取需要消费的消息,如果获取不到就阻塞直到有消息为止;修改后的逻辑是线程来获取需要消费的消息,如果获取不到就返回做别的事情,过一段时间再来获取消息。如果粗略来考虑:这就是把阻塞变成非阻塞来提高效率的一个配置修改啊。所以开发小哥哥也没压测,甚至没有告诉任何人他做了这个变更,直接投产了。这个变更造成了公司数千万的资金损失。

敬畏生产,不要因为只是添加一个索引或者修改一个配置而不做测试直接投产。

00e22c51e54aa2d9252cf20bd85381d2.png

42613f0e84a50b6c4eaf0190c5f443df.jpeg

这篇关于添加一个索引要投产,需要哪些步骤?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972785

相关文章

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建