如何在生产环境中千万表添加索引并保证数据一致性
技术分享文档:如何在生产环境中千万表添加索引并保证数据一致性
目录
- 引言
- 添加索引的挑战
- 解决方案概述
- 详细步骤
4.1 创建新表并添加索引
4.2 批量导入数据
4.3 处理增量数据
4.4 表名切换 - 确保数据一致性
5.1 暂停写操作
5.2 记录增量数据
5.3 应用增量数据 - 设置回滚计划
6.1 备份原表
6.2 使用事务
6.3 预备切换回旧表 - 监控和验证
- 总结
1. 引言
在电商平台中,商品评论表(product_reviews)是一个关键的表,记录了用户对商品的评价信息。随着评论数量的增加,查询和检索评论的效率变得尤为重要。本分享文档将介绍如何在生产环境中安全地对product_reviews表添加索引,以提高查询性能,同时保证数据一致性。
2. 添加索引的挑战
- 性能影响:直接在生产环境中添加索引可能导致长时间锁表,影响读写操作。
- 数据一致性:在添加索引过程中,如果有新的数据插入、更新或删除,可能导致数据不一致。
- 停机时间:为了尽量减少停机时间,需要找到一种可以在线执行的方案。
3. 解决方案概述
通过以下步骤,可以在生产环境中安全地对product_reviews表添加索引:
- 创建新表并添加所需索引。
- 批量将原表数据导入新表。
- 处理在数据导入过程中产生的增量数据。
- 切换表名,将新表替换为原表。
4. 详细步骤
4.1 创建新表并添加索引
首先,创建一张与product_reviews表结构相同的新表,并在新表上添加所需的索引。例如,我们需要为product_id和created_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 监控系统的全球支持和无界服务变得至关重要。随着企业业务的全球化扩展,传统的监控工具往往因地域限制而无法满足全球统一监控的需求。观测云通过其全球部署的数据采集点和多语言支持,确保了无论数据产生于何处ÿ…...
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输入:读取,捕获(信息)(控制)…...
动手学强化学习 第 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 线程重放事务这三步之间是异步的。 异步复制的主库不需要关心备库的状态,主库不保证事务被传输到从库…...
[一本通提高数位动态规划]数字游戏:取模数题解
[一本通提高数位动态规划]数字游戏:取模数题解 1前言2问题3状态的设置4数位dp-part1预处理5数位dp-part2利用状态求解6代码7后记 1前言 本文为数字游戏:取模数的题解 需要读者对数位dp有基础的了解,建议先阅读 论数位dp–胎教级教学 B3883 […...
[Day 39] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的安全性分析 區塊鏈技術已經成為現代數字經濟的一個重要組成部分,提供了去中心化、透明和不可篡改的數據存儲與交易系統。然而,隨著區塊鏈技術的廣泛應用,其安全性問題也日益受到關注。本篇文章將詳細探討區塊鏈技術的安全性…...
OpenStack入门体验
一、云计算概述 1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算服务运行在若干台高性能物理服务器之上,提供每秒 10万亿次的运算能力…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
