MySQL如何执行批量数据操作 基础INSERT/UPDATE批量处理技巧

批量插入操作要点: 1 .多值条目,一个SQL包包含多行,但总长度不能超过max_allowed_packet(默认1 MB)。
示例: SQL 插入您的_表 (col1 , col2 ) 值 ('v1 ','v2 '), ('v3 ', 'v4 '); 大量数据(例如 1 00,000 多行)需要拆分为 5 ,000-1 0,000 行/批次。

2 Load Data Infile效率高,可以直接读取并导入文件。
示例: SQL 将 DATA INFILE '/path/data.csv' 加载到表中 以“,”结尾的字段 (列1 ,列2 ); 注意:文件路径必须能够被服务器访问,并且用户必须具有文件权限。

3 INSERT INTO ... SELECT 适用于在表之间复制或执行计算。
示例: SQL 插入目标(col1 ) 从源中选择 col2 ,其中 id < 1>4 处理纠纷:
插入忽略:忽略主键/唯一键冲突。
SQL INSERT INTO 表(col)值('val');
关于重复键更新:如果存在冲突,则更新列值。
SQL 插入表(col)值('val') 更新时重复键 col = 'new_val';
5 事务包:使用START TRANSACTION...COMMIT进行批量操作。
SQL 开始交易; INSERT INTO 表(COL) 值('val'); 坚定的;
6 批量大小:
测试服务器(8 核1 6 G)发现每批5 00-2 000行比较合适。

小批量(<1>5 000行)容易出现锁定和等待。

---
需要批量更新操作: 1 . 对列应用条件更新的情况。
示例: SQL 更新表集列 = 案例 ID When 1 then 'Val 1 ' Else Column End 其中 id(1 , 2 , 3 );
2 多表join更新:使用update...join。
示例: SQL 更新 t1 ,将 t2 添加到 t1 .id = t2 .id 设置 t1 .col = t2 .col 其中 t1 .date <'2 02 3 -01 -01 ';
3 批处理:数百万数据被分成5 000/1 0000行的批次。
SQL UPDATE table set col = 'val' 其中 id 介于 1 到 5 000 之间; UPDATE table set col = 'val' 其中 id 介于 5 001 和 1 0000 之间;
---
性能优化的关键: 1 .减少网络:封装SQL语句,避免重复交互。
2 . SQL优化:使用简单的WHERE条件和索引覆盖率。
3 .磁盘I/O:使用InnoDB批量操作合并写入。

注意:
很容易在长事务(>5 分钟)中锁定表并监视事务的持续时间。

当binlog压力较大时,主从复制会延迟并在非高峰时段执行。

自己掂量一下。

如何使用 MySQL Update 和 Left Join 更新多条数据中的最大字段值?

是的,这就是问题所在。
更新学生的分数并使用子查询查找最大值。

先说核心:UPDATE Student SET Score = (SELECT MAX(score) FROM Score WHERE Score.student_id = Student.id);
这意味着将student表中每个学生的分数更新为score表中学生ID对应的最高分数。

解释:
UPDATE Students:告诉MySQL你想要更新students表。

SET Score = (SELECT MAX(score) FROM Score WHERE Score.student_id = Student.id):这部分是关键。
使用子查询查找分数表中每个学生ID的最高分数,然后更新学生表的分数字段。

注意:
子查询必须返回一个值,否则使用 MAX() 和 MIN() 等函数。

如果分数表中没有匹配的记录,则学生表中的分数将为NULL。
可以通过使用 COALESCE 函数来避免这种情况,例如: UPDATE Student SET Score = COALESCE((SELECT MAX(score) FROM Score WHERE Score.student_id = Student.id), 0);
处理大表时,确保相关字段有索引,以提高效率。

还有一种替代方法,使用 JOIN: 学生更新 JOIN (SELECT Student_id, MAX(score) AS max_score FROM Score GROUP BY Student_id) AS 温度 ON 学生.id = temp.student_id SET Student.score = temp.max_score;
这种方法比较复杂,但有时更简单。

你自己看看。
您还有其他问题吗?