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

如何在生产环境中千万表添加索引并保证数据一致性

技术分享文档:如何在生产环境中千万表添加索引并保证数据一致性

目录

  1. 引言
  2. 添加索引的挑战
  3. 解决方案概述
  4. 详细步骤
    4.1 创建新表并添加索引
    4.2 批量导入数据
    4.3 处理增量数据
    4.4 表名切换
  5. 确保数据一致性
    5.1 暂停写操作
    5.2 记录增量数据
    5.3 应用增量数据
  6. 设置回滚计划
    6.1 备份原表
    6.2 使用事务
    6.3 预备切换回旧表
  7. 监控和验证
  8. 总结

1. 引言

在电商平台中,商品评论表(product_reviews)是一个关键的表,记录了用户对商品的评价信息。随着评论数量的增加,查询和检索评论的效率变得尤为重要。本分享文档将介绍如何在生产环境中安全地对product_reviews表添加索引,以提高查询性能,同时保证数据一致性。

2. 添加索引的挑战

  • 性能影响:直接在生产环境中添加索引可能导致长时间锁表,影响读写操作。
  • 数据一致性:在添加索引过程中,如果有新的数据插入、更新或删除,可能导致数据不一致。
  • 停机时间:为了尽量减少停机时间,需要找到一种可以在线执行的方案。

3. 解决方案概述

通过以下步骤,可以在生产环境中安全地对product_reviews表添加索引:

  1. 创建新表并添加所需索引。
  2. 批量将原表数据导入新表。
  3. 处理在数据导入过程中产生的增量数据。
  4. 切换表名,将新表替换为原表。

4. 详细步骤

4.1 创建新表并添加索引

首先,创建一张与product_reviews表结构相同的新表,并在新表上添加所需的索引。例如,我们需要为product_idcreated_at字段添加索引,以加速基于商品和时间的查询。

CREATE TABLE new_product_reviews LIKE product_reviews;
CREATE INDEX idx_product_id ON new_product_reviews (product_id);
CREATE INDEX idx_created_at ON new_product_reviews (created_at);

4.2 批量导入数据

使用分页查询,将原表数据批量导入新表,以减少对系统的影响。

INSERT INTO new_product_reviews SELECT * FROM product_reviews WHERE id BETWEEN start_id AND end_id;

4.3 处理增量数据

在数据导入过程中,如果无法暂停写操作,需要记录并处理增量数据。可以使用触发器来记录所有的更改。

CREATE TABLE delta_changes (id INT,change_type CHAR(1),change_time TIMESTAMP,old_values TEXT,new_values TEXT
);CREATE TRIGGER record_changes
AFTER INSERT OR UPDATE OR DELETE ON product_reviews
FOR EACH ROW
BEGININSERT INTO delta_changes (id, change_type, change_time, old_values, new_values)VALUES (OLD.id, CASE WHEN OLD.id IS NULL THEN 'I' WHEN NEW.id IS NULL THEN 'D' ELSE 'U' END, NOW(), OLD.values, NEW.values);
END;

4.4 表名切换

在确保新表数据与原表完全一致后,进行表名切换操作。

RENAME TABLE product_reviews TO product_reviews_backup, new_product_reviews TO product_reviews;

5. 确保数据一致性

5.1 暂停写操作

在执行数据导入和切换操作之前,尽量暂停对product_reviews表的所有写操作,以确保数据一致性。

5.2 记录增量数据

如果无法暂停写操作,可以使用触发器或应用层日志记录所有对product_reviews表的写操作。

5.3 应用增量数据

在导入数据后,将记录的增量数据应用到新表,以确保数据一致性。

-- 插入增量数据
INSERT INTO product_reviews (columns) SELECT new_values FROM delta_changes WHERE change_type = 'I';-- 更新增量数据
UPDATE product_reviews SET columns = new_values FROM delta_changes WHERE change_type = 'U' AND id = delta_changes.id;-- 删除增量数据
DELETE FROM product_reviews WHERE id IN (SELECT id FROM delta_changes WHERE change_type = 'D');

6. 设置回滚计划

6.1 备份原表

在进行操作之前,备份product_reviews表的数据,以防出现问题时可以快速恢复。

CREATE TABLE product_reviews_backup AS SELECT * FROM product_reviews;

6.2 使用事务

在执行重要操作时,使用事务以便在出现错误时可以回滚。

START TRANSACTION;-- 进行数据操作-- 如果成功,提交事务
COMMIT;-- 如果失败,回滚事务
ROLLBACK;

6.3 预备切换回旧表

在切换表名操作之前,准备好切换回旧表的脚本,以防新表有问题时能快速恢复。

RENAME TABLE product_reviews_backup TO product_reviews;  -- 在出现问题时执行此操作

7. 监控和验证

在操作完成后,仔细监控新表的性能和数据一致性,确保其正常工作。如果发现问题,立即执行回滚操作。

8. 总结

通过本文介绍的方法,可以有效地在生产环境中对product_reviews表添加索引,并最小化对系统的影响。同时,通过谨慎的操作和全面的回滚计划,可以确保数据的一致性和系统的稳定性。希望这份文档对您的工作有所帮助。


这个技术分享文档可以帮助团队成员理解在生产环境中添加索引的最佳实践,并确保操作的安全性和有效性。

相关文章:

如何在生产环境中千万表添加索引并保证数据一致性

技术分享文档:如何在生产环境中千万表添加索引并保证数据一致性 目录 引言添加索引的挑战解决方案概述详细步骤 4.1 创建新表并添加索引 4.2 批量导入数据 4.3 处理增量数据 4.4 表名切换确保数据一致性 5.1 暂停写操作 5.2 记录增量数据 5.3 应用增量数据设置回滚…...

Uni-APP页面跳转问题(十六)

【背景】最近在做公司一个PAD端,谁被点检功能,主要时为了移动端点检设备和打印标签,需求比较简单就是扫描设备二维码,问题在于扫描后要能够重复进行多设备的扫描;早期开发的设备点检能够满足需求但是当连续扫描五六十个设备后,APP卡死,必须重启才能使用。 界面原图: 输…...

Java新特性(二) Stream与Optional详解

Java8新特性(二) Stream与Optional详解 一. Stream流 1. Stream概述 1.1 基本概念 Stream(java.util.stream) 是Java 8中新增的一种抽象流式接口,主要用于配合Lambda表达式提高批量数据的计算和处理效率。Stream不是…...

springboot系列教程(三十一):springboot整合Nacos组件,环境搭建和入门案例详解

一、Nacos基础简介 1、概念简介 Nacos 是构建以“服务”为中心的现代应用架构,如微服务范式、云原生范式等服务基础设施。聚焦于发现、配置和管理微服务。Nacos提供一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管…...

Traefik系列

一、入门Traefik系列——基础简介 官方文档 https://doc.traefik.io/traefik/[1] 简介 Traefik是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Re…...

【力扣】3128. 直角三角形 JAVA

一、题目描述 给你一个二维 boolean 矩阵 grid 。 请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。 注意: 如果 grid 中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素…...

如何全面提升企业安全意识

引言 在当今数字化和信息化的时代,网络安全已成为企业运营不可忽视的核心问题。员工的安全意识直接关系到企业的数据安全和整体网络防护能力。即使企业采用了先进的安全技术,如果员工缺乏足够的安全意识,仍然容易成为攻击者的突破口。本文将…...

全球支持与无界服务:跨越地域的数据采集与分析

在当今企业运营中,IT 监控系统的全球支持和无界服务变得至关重要。随着企业业务的全球化扩展,传统的监控工具往往因地域限制而无法满足全球统一监控的需求。观测云通过其全球部署的数据采集点和多语言支持,确保了无论数据产生于何处&#xff…...

Java面试八股之简述spring boot的目录结构

简述spring boot的目录结构 Spring Boot 项目遵循标准的 Maven 或 Gradle 项目布局,并且有一些约定的目录用于组织不同的项目组件。下面是一个典型的 Spring Boot 项目目录结构: src/main/java:包含所有的 Java 源代码,通常按包组…...

python == 与 is区别

刷到一个面试题 python中 与 is 的区别 根据以往的经验,这个问题应该考察的是运算符根据地址 还是值进行比较的 s1 [a] s2 [a] s3 s1 print(s1 s2) # True 值相等 print(s1 s3) # True 值相等 print(s1 is s2) # False 值相等,引用地址不相…...

STM32学习笔记1---LED,蜂鸣器

目录 GPIO LED 蜂鸣器 RCC外设 GPIO外设 总概 操作STM32的GPIO 代码 LED闪烁 LED流水灯 蜂鸣器! 连接方式 GPIO GPIO输出:向外驱动控制 GPIO输入:读取,捕获(信息)(控制&#xff09…...

动手学强化学习 第 15 章 模仿学习 训练代码

基于 https://github.com/boyu-ai/Hands-on-RL/blob/main/%E7%AC%AC15%E7%AB%A0-%E6%A8%A1%E4%BB%BF%E5%AD%A6%E4%B9%A0.ipynb 理论 模仿学习 修改了警告和报错 运行环境 Debian GNU/Linux 12 Python 3.9.19 torch 2.0.1 gym 0.26.2 运行代码 #!/usr/bin/env pythonimpor…...

第一阶段面试问题(前半部分)

1. 进程和线程的概念、区别以及什么时候用线程、什么时候用进程? (1)线程 线程是CPU任务调度的最小单元、是一个轻量级的进程 (2)进程 进程是操作系统资源分配的最小单元 进程是一个程序动态执行的过程,包…...

《数学教学通讯》是一本怎样的刊物?投稿难吗?

《数学教学通讯》是一本怎样的刊物?投稿难吗? 《数学教学通讯》是一本具有较高学术价值的教育类刊物。它创刊于 1979 年,由西南大学主管,西南大学数学与统计学院、重庆市数学学会主办,出版周期为旬刊。该刊物在国内外…...

<机器学习> K-means

K-means定义 K-means 是一种广泛使用的聚类算法,旨在将数据集中的点分组为 K 个簇(cluster),使得每个簇内的点尽可能相似,而不同簇的点尽可能不同。K-means 算法通过迭代的方式,逐步优化簇的分配和簇的中心…...

我们如何优化 Elasticsearch Serverless 中的刷新成本

作者:来自 Elastic Francisco Fernndez Castao, Henning Andersen 最近,我们推出了 Elastic Cloud Serverless 产品,旨在提供在云中运行搜索工作负载的无缝体验。为了推出该产品,我们重新设计了 Elasticsearch,将存储与…...

MySQL半同步复制

1.MySQL主从复制模式 1.1异步复制 异步复制为 MySQL 默认的复制模式,指主库写 binlog、从库 I/O 线程读 binlog 并写入 relaylog、从库 SQL 线程重放事务这三步之间是异步的。 异步复制的主库不需要关心备库的状态,主库不保证事务被传输到从库&#xf…...

[一本通提高数位动态规划]数字游戏:取模数题解

[一本通提高数位动态规划]数字游戏:取模数题解 1前言2问题3状态的设置4数位dp-part1预处理5数位dp-part2利用状态求解6代码7后记 1前言 本文为数字游戏:取模数的题解 需要读者对数位dp有基础的了解,建议先阅读 论数位dp–胎教级教学 B3883 […...

[Day 39] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的安全性分析 區塊鏈技術已經成為現代數字經濟的一個重要組成部分,提供了去中心化、透明和不可篡改的數據存儲與交易系統。然而,隨著區塊鏈技術的廣泛應用,其安全性問題也日益受到關注。本篇文章將詳細探討區塊鏈技術的安全性&#xf…...

OpenStack入门体验

一、云计算概述 1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算服务运行在若干台高性能物理服务器之上,提供每秒 10万亿次的运算能力…...

预测未来 | MATLAB实现RF随机森林多变量时间序列预测未来-预测新数据

预测未来 | MATLAB实现RF随机森林多变量时间序列预测未来-预测新数据 预测效果 基本介绍 随机森林属于 集成学习 中的 Bagging(Bootstrap AGgregation 的简称) 方法。如果用图来表示他们之间的关系如下: 随机森林是由很多决策树构成的,不同决策树之间没有关联。当我们进行…...

iOS 系统提供的媒体资源选择器(UIImagePickerController)

简介 图片或者视频的选择功能几乎是每个APP必不可少的,UIImagePickerController 是 iOS 系统提供的一个方便的媒体选择器,允许用户从照片库中选择图片或视频,或者使用相机拍摄新照片和视频。 它的页面简单易用,代码稳定可靠&…...

电脑如何扩展硬盘分区?告别空间不足困扰

在数字化时代,电脑硬盘的存储空间显得愈发重要。随着个人文件、应用程序和系统更新的不断累积,原有的硬盘分区可能很快就会被填满。为了解决这个问题,扩展硬盘分区成为了一个非常实用的方法。那么,电脑如何扩展硬盘分区呢&#xf…...

论文阅读:Mammoth: Building math generalist models through hybrid instruction tuning

Mammoth: Building math generalist models through hybrid instruction tuning https://arxiv.org/pdf/2309.05653 MAmmoTH:通过混合指令调优构建数学通才模型 摘要 我们介绍了MAmmoTH,一系列特别为通用数学问题解决而设计的开源大型语言模型&#…...

什么样的双筒式防爆器把煤矿吸引?

什么样的双筒式防爆器把煤矿吸引?要有好的服务和态度,要用心去聆听客户的需求,去解决客户的疑虑,用诚信去赢得客户的信任。 150产品的技术特点 双筒式防爆器采用双罐结构,其水封水位观测直观、能够快速有效排污、操作…...

如何保证冰河AL0 400G 100W 的稳定运行?

要保证冰河 AL0 400G 100w 的稳定运行,可以考虑以下几点: 1. 适宜的工作环境:确保设备放置在通风良好、温度适宜的环境中。良好的散热条件有助于防止设备过热,因为过热可能会导致性能下降或故障。该设备采用纯铝合金外壳&#xf…...

剪画小程序:巴黎奥运会,从画面到声音!

在巴黎奥运会的赛场上,每一个瞬间都伴随着独特的声音。那是观众的欢呼,是运动员冲刺的呐喊,是国歌奏响的激昂旋律。 如今,通过剪画音频提取,我们能够将这些珍贵的声音从精彩的画面中分离出来,单独珍藏。 想…...

【leetcode详解】心算挑战: 一题搞懂涉及奇偶数问题的 “万金油” 思路(思路详解)

前记: 做了几日的leetcode每日一题,几乎全是十分钟结束战斗的【中等】题,今日杀出来个【简单】题,反倒开始难以想出很清楚的解题思路,反复调试修改才将题目逐渐考虑全面,看到了原本思路的漏洞&#xff0c…...

【资料集】数据库设计说明书(Word原件提供)

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…...

MySQL 常用查询语句精粹

引言 MySQL 是一种广泛使用的开源关系型数据库管理系统,其强大的查询语言为用户提供了丰富的数据处理能力。掌握 MySQL 的常用查询语句对于数据库管理和数据分析至关重要。本文将介绍一些 MySQL 中的常用查询语句,并提供实际的示例。 基础查询 1. 选择…...

建设网站必须要钱吗/免费推广的网站

单机版 在线安装 1.在线安装 apt-install redis-server 2.配置文件 etc/redis/redis.conf 3.设置redis远程访问 修改 vi /etc/redis/redis.conf bind 127.0.0.1 此行注释掉 4.重启redis service redis-server restart 5.添加用户密码 修改 vi /etc/redis/redis.…...

做网站一般什么问题/百度seo优化公司

计算机基础课程教学与学习模式的研究大学计算机基础教学反思浅谈大学计算机基础课程教学计算思维是计算机技术发展的必然结果。随着电子信息时代的发展,计算思维逐渐被应用于方方面面。大学阶段,计算机基础课程是一项培养学生计算机操作能大学计算机基础…...

沙井做网站公司/中国站免费推广入口

git命令使用:提交前可指定要提交哪些文件,然后使用git commit来提交 样例: git status 输出: Changes to be committed: modified: app/Library/Common.php Changes not staged for commit: modified: .env modified: index…...

平顶山市建设局网站/百度竞价排名案例分析

标题: A Robust Laser-Inertial Odometry and Mapping Method for Large-Scale Highway Environments作者: Shibo Zhao, Zheng Fang, HaoLai Li, Sebastian Scherer1摘要我们提出了一种新的激光惯性里程计和建图方法,以实现大规模公路环境中的实时、低漂移和鲁棒的位姿估计.该方…...

asp源码网站/图片优化网站

1.列表生成式 # 单层循环: 生成一个列表,列表元素为[1*1,2*2...9*9] print([i*i for i in range(1,10)])输出结果如下: [1, 4, 9, 16, 25, 36, 49, 64, 81]# 多层循环: print([ ij for i in ABC for j in XYZ])输出结果如下: [AX, AY, AZ, BX, BY, BZ, CX, CY, CZ]# 循环判断语…...

做蛋糕哪个教程网站好/百度seo服务

https://codeforces.com/gym/101630 题目大意:给一个有向图,有nnn个点,mmm条边,保证m>2∗nm>2*nm>2∗n,保证输入没有重边且任意两个点均可达,现在要删除m−2∗nm-2*nm−2∗n条边,使得任…...