IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mysql更新百万历史数据 -> 正文阅读

[大数据]Mysql更新百万历史数据

场景

目前在main库里有一张main_test表,数据大约1000万

CREATE TABLE
    main.main_test
    (
        id BIGINT NOT NULL COMMENT '主键ID',
        name VARCHAR(100) COMMENT '名称',
        PRIMARY KEY (id)
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='主表';

需求为给main_test表添加一code列

ALTER TABLE main_test ADD COLUMN code  VARCHAR(60) COMMENT '代码' AFTER id ;

然后从另一个数据库sla的表slave_test关联更新main_test表的code,具体关联关系为

UPDATE main.main_test mt INNER JOIN sla.slave_test st ON mt.name = st.name SET mt.code = st.code;

问题

  1. main_test表与slave_test表不在同一个库,因此不能直接关联更新
  2. 即使在同一个库,但是main_test表数据量大,并且name字段没有索引,也不能临时添加索引,强行在生产环境更新会因为锁表阻塞导致应用雪崩

解决方案

1、在main库创建临时表main_test_tmp

CREATE TABLE
    main.main_test_tmp
    (
        id INT AUTO_INCREMENT PRIMARY KEY NOT NULL COMMENT '主键ID',
        test_id BIGINT COMMENT 'main_test表主键', 
        name VARCHAR(100) COMMENT '名称',
        code VARCHAR(60) COMMENT '代码'
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='主表';

2、查询slave_test表并导出到文件
建议导出为insert sql,并检查 name, code 值是否包含单引号’,将一个单引号’替换成两个单引号’,如’替换成’’,防止sql注入攻击。目标表修改为main_test_tmp

SELECT name, code FROM sla.slave_test WHERE code IS NOT NULL AND name IS NOT NULL

3、向main_test_tmp表插入文件中的sql
4、给main_test_tmp表name字段创建前缀索引
因为name字段长度为100,一些数据库对索引长度有限制,并且name字段的前10个字符唯一度已经很高

ALTER TABLE main_test_tmp ADD INDEX (name(10));

5、更新main_test_tmp表的test_id字段

UPDATE main_test_tmp mtt INNER JOIN main_test mt ON mtt.name = mt.name SET mtt.test_id = mt.id
WHERE mt.code IS NULL;

6、给main_test_tmp表test_id字段创建索引
注意,第6步只执行一次,以后不再执行

ALTER TABLE main_test_tmp ADD INDEX  (test_id);

7、查询main_test_tmp表是否存在test_id字段不为null的数据

SELECT * FROM main_test_tmp WHERE test_id IS NOT NULL LIMIT 1;

如果存在,则继续下一步,否则执行第11步。

8、更新main_test表的code字段

UPDATE main_test mt INNER JOIN main_test_tmp mtt ON mt.id = mtt.test_id SET mt.code = mtt.code
WHERE mtt.test_id IS NOT NULL;

9、main_test_tmp表test_id字段都更新为null

UPDATE TABLE main_test_tmp SET test_id = null;

10、回到第5步,重复步骤(需要跳过第6步)
11、main_test表的code字段更新完毕,删除临时表main_test_tmp

DROP TABLE main_test_tmp;

说明

以上只考虑了main_test表name字段重复的情况。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:18:09  更:2022-04-04 12:21:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:33:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码