首页
学习
活动
专区
圈层
工具
发布

c mysql批量insert数据

基础概念

MySQL 批量插入(Batch Insert)是指一次性向数据库表中插入多条记录,而不是逐条插入。这种操作可以显著提高数据插入的效率,因为它减少了与数据库服务器之间的通信次数。

优势

  1. 提高性能:批量插入减少了网络开销和数据库的 I/O 操作,从而提高了数据插入的速度。
  2. 减少锁竞争:相比于逐条插入,批量插入可以减少表锁的持有时间,降低锁竞争的概率。
  3. 简化代码:批量插入可以使代码更加简洁,易于维护。

类型

MySQL 批量插入主要有以下几种方式:

  1. 使用 INSERT INTO ... VALUES 语法:
  2. 使用 INSERT INTO ... VALUES 语法:
  3. 使用 INSERT INTO ... SELECT 语法:
  4. 使用 INSERT INTO ... SELECT 语法:

应用场景

批量插入适用于以下场景:

  1. 数据迁移:将大量数据从一个数据库迁移到另一个数据库。
  2. 数据导入:从文件或其他数据源批量导入数据到数据库。
  3. 日志记录:将大量日志记录一次性插入到日志表中。

常见问题及解决方法

问题1:批量插入时遇到 MySQL server has gone away 错误

原因:这个错误通常是由于插入的数据量过大,超过了 MySQL 服务器的最大允许包大小(max_allowed_packet)。

解决方法:

  1. 增加 max_allowed_packet 的大小:
  2. 增加 max_allowed_packet 的大小:
  3. 分批次插入数据,避免一次性插入过多数据。

问题2:批量插入时遇到 Duplicate entry 错误

原因:插入的数据中存在重复的键值,违反了表的唯一性约束。

解决方法:

  1. 使用 INSERT IGNORE 语法忽略重复的记录:
  2. 使用 INSERT IGNORE 语法忽略重复的记录:
  3. 使用 ON DUPLICATE KEY UPDATE 语法更新重复的记录:
  4. 使用 ON DUPLICATE KEY UPDATE 语法更新重复的记录:

示例代码

以下是一个使用 Python 和 MySQL Connector 进行批量插入的示例:

代码语言:txt
复制
import mysql.connector

# 连接到 MySQL 数据库
cnx = mysql.connector.connect(user='user', password='password',
                              host='host', database='database')
cursor = cnx.cursor()

# 准备批量插入的数据
data = [
    ('value1', 'value2', 'value3'),
    ('value4', 'value5', 'value6'),
    # ...
]

# 执行批量插入
query = "INSERT INTO table_name (column1, column2, column3) VALUES (%s, %s, %s)"
cursor.executemany(query, data)

# 提交事务
cnx.commit()

# 关闭连接
cursor.close()
cnx.close()

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 使用python将逐条insert转为批量insert

    需求背景研发有时候交付过来一批sql,(可能是navicat之类的客户端导出的)todo.sql 文件内容类似如下:INSERT INTO `sbtest`....`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');这是一批逐条insert的语句,插入数据库会很慢。...因此考虑将其转为批量插入方式,提升其导入效率。代码实现# 将多行的逐条insert文件,合并为N个批量insert sql。注意每条insert必须是在每一行,不能换行。...subprocess# 待处理的文件名(这里需要根据实际情况修改)origial_file="todo.sql"# 切分的行数(这里为了演示调的比较小,生产建议设为1000到5000batch_size=10# 数据库的表名和列名...stmt in insert_statements] print(values) # 拼接成一条合并的INSERT语句 merged_statement =

    64510

    大批量合并insert导致的MySQL性能问题分析

    问题反馈 用户反馈insert待入库的队列堆积,当前还有1000W+的insert在消息队列中等待入口,请求堆积严重,怀疑数据库性能有问题 [入库队列拥堵值] 用户质疑 分析如下两张图中的时间点,那么如果是因为大量合并...insert导致的IO瓶颈,那么下午两点的时候,宿主机IO负载降低到正常水平时,通过分析慢查询日志,发现insert指令执行反而更慢,拥塞反而更严重?...[错误码、业务量级、入库队列拥堵值] [实例维度以及宿主机维度的信息] 排查问题 show processlist发现,有大量合并后的批量insert 企业微信截图_440268d3-8ce4-4ca3...-b686-2c143cc3dafb(1).png 查看云控制台和后台监控信息,可以看到IO已经打满了 [实例维度以及宿主机维度的磁盘写入监控图] 查看实例详细的数据监控,我们可以看到 [实例详细监控数据...由于批量合并insert超出了吞吐极限,导致写了磁盘,导致了出现异常,异常原因及原理参考上面截图 -当宿主机IO负载降低到正常水平时,通过分析慢查询日志,发现insert指令执行反而更慢,拥塞反而更严重

    2.5K40

    【MySQL百日打怪升级第15天】INSERT 批量插入的最佳实践:别再逐条 INSERT 了!

    【第15天】每天一个MySQL知识点,百日打怪升级INSERT批量插入的最佳实践:别再逐条INSERT了!大家好,我是一名拥有10年以上经验的DBA老兵,没有那多。...今天的目标:搞懂为什么逐条INSERT慢,以及批量插入的正确姿势。核心概念一条INSERT的背后,MySQL在忙什么?...文件在MySQL服务器端直接读取,不走SQL解析层解析完的数据直接进入存储引擎,几乎不产生网络开销InnoDB内部会把数据按主键排序后批量写入——减少了B+树页分裂提到这个就不得不翻一下TAOC了——《...实战案例场景一:重复数据的三种处理方式批量插数据经常遇到一个问题——数据里有重复的主键或唯一键。...:找到项目里最大的那个数据导入脚本,看看是逐条INSERT还是批量INSERT。

    76910

    MySQL 添加数据 insert 命令及优化

    省略字段名时,必须依次添加所有段的值 insert [into] 表名 value(值1, 值2[, ...]); 只添加一条数据时,也可以使用 insert ... set 命令 此方式无法插入空值... into user(`status`, `create_time`) value(1, 1602295286); c....', '男', 20); 添加一条数据时也可以用 insert ... set insert into user set `nickname` = '大王', `status` = '0'; 添加多条数据...优化 insert 语句 ---- 当进行数据的 insert 操作时,可以考虑以下几种优化方案 方案一: 如果需要同时对一张表插入很多行数据时,应该尽量使用多个值的 insert 语句,这种方式将大大缩减客户端与数据库之间的连接...: 主键索引值大小参差不齐,导致插入数据后会频繁构建索引,效率较低 insert into `user` values(4, 'Rose');insert into `user` values(3, '

    1.8K30

    mysql update,insert常用

    https://blog.csdn.net/haluoluo211/article/details/77984451 本文主要内容: update更新,batch批量更新 insert 数据到表中...,将表中数据插入到另一个表中 insert ignore忽略重复数据插入报错问题 ---- update更新,batch批量更新 ---- set sql_safe_updates=0; # 常规update...insert 数据到表中,将表中数据插入到另一个表中 ---- 基本插入示例: INSERT INTO tb_name(col1, col2) VALUES ("hyq","M"); # 例如 insert...into teacher(name, age) values('jack ma', 32); 工作中,往往我们要把一个表中的数据插入到另一张表中: INSERT INTO tb_al_sample...---- 当表中存在唯一索引时,如果插入相同的值,mysql会报错,所以我们一般使用: insert ignore into tb_name (title, introduction) VALUES

    4.6K30

    MySQL INSERT 进阶用法

    其实,MySQL提供了几种INSERT变体语法,可以优雅地处理有则更新,无则插入的场景,一条SQL就能搞定,性能大幅提升。 标准 INSERT 在介绍进阶用法之前,先回顾一下最基础的插入语法。...INSERT INTO 是 MySQL 中最常用的数据操作语句之一,用于向表中添加新记录。无论是单个用户注册、批量数据导入,还是系统初始化,都离不开这条基础语法。...INSERT IGNORE INSERT IGNORE 是 MySQL 中的一种 INSERT 变体语法,用于在插入数据时忽略主键或唯一索引冲突。...使用 INSERT IGNORE 可能会跳过重要的业务校验,导致数据不一致或业务逻辑错误 REPLACE INTO REPLACE INTO 是 MySQL 中的一种 INSERT 变体语法,用于在插入数据时替换主键或唯一索引冲突的记录...积分累加、计数器 ON DUPLICATE KEY UPDATE 可以累加而非覆盖 部分字段更新 ON DUPLICATE KEY UPDATE 其他字段保持不变 大批量数据导入 批量 INSERT

    46100

    关联表多数据的批量insert (批量导入,测试19W条数据用时46秒)

    一、业务需求 :作多个批量导入 ,根据业务不同,每条数据导入前作各种验证, 导入后提示验证失败的所有数据和原因。 二、思路: 1....批量导入用 jdbc 直连数据库 addBatch方法实现 ,不走 Mybatis , 2. 数据验证用 SQL 语句实现,不走 Mybatis , 3....创建临时表记录合格数据并导入正式数据库表 4. 创建临时表记录验证失败的数据,并最终返回 5....由于业务需求批量导入时是要导入到 2 张主外键关联表 , 所以一次性获取多个序列值以实现 2 表主外键的一致性。 6....; BatchInsert.exeBatch(insertSql , usrlist); // 批量导入到新增数据表 // 插入问题数据(用户已存在)-sql

    1.9K50
    领券