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

mysql 批量insert语句

基础概念

MySQL 批量插入(Batch Insert)是指在一次数据库操作中插入多条记录,而不是逐条插入。这种操作可以显著提高数据插入的效率,因为它减少了与数据库的交互次数。

优势

  1. 提高性能:批量插入减少了网络开销和数据库的 I/O 操作,从而提高了插入速度。
  2. 减少锁竞争:批量插入可以减少对表的锁定时间,降低锁竞争的概率。
  3. 简化代码:通过一次操作插入多条记录,简化了代码逻辑。

类型

MySQL 支持多种批量插入的方式:

  1. 单条 INSERT 语句插入多条记录
  2. 单条 INSERT 语句插入多条记录
  3. 使用 UNION ALL
  4. 使用 UNION ALL
  5. 使用 LOAD DATA INFILE
  6. 使用 LOAD DATA INFILE

应用场景

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

  1. 数据导入:从外部文件或其他数据库导入大量数据。
  2. 批量操作:在应用程序中需要一次性插入多条记录的场景。
  3. 日志记录:记录大量日志信息时,使用批量插入可以提高效率。

常见问题及解决方法

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

原因: 这个错误通常是由于插入的数据量过大,超过了 MySQL 的 max_allowed_packet 配置限制。

解决方法

  1. 增加 max_allowed_packet 配置
  2. 增加 max_allowed_packet 配置
  3. 分批插入:将数据分成多个小批次进行插入。

问题:批量插入时遇到 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()

# 批量插入数据
sql = "INSERT INTO table_name (column1, column2, column3) VALUES (%s, %s, %s)"
data = [
    ('value1', 'value2', 'value3'),
    ('value4', 'value5', 'value6'),
    ('value7', 'value8', 'value9')
]

cursor.executemany(sql, data)
cnx.commit()

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

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

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

相关·内容

  • 图解MySQL | MySQL insert 语句的磁盘写入之旅

    本文来源:转载自公众号-图解 MySQL *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 ---- 一条 insert 语句在写入磁盘的过程中到底涉及了哪些文件?...下面我们用两张图和大家一起解析 insert 语句的磁盘写入之旅。 图 1:事务提交前的日志文件写入 ?...我们知道 InnoDB 会将数据页缓存至内存中的 buffer pool,所以 insert 语句到了这里并不需要立刻将数据写入磁盘文件中,只需要修改 buffer pool 当中对应的数据页就可以了。...但仅仅写入内存的 buffer pool 并不能保证数据的持久化,如果 MySQL 宕机重启了,需要保证 insert 的数据不会丢失。...综上(在 InnoDB buffer pool 足够大且上述的两个参数设置为双一时),insert 语句成功提交时,真正发生磁盘数据写入的,并不是 MySQL 的数据文件,而是 redo log 和 binlog

    5.6K32

    MySQL DML语句insert全表数据添加语句以及注意事项

    MySQL DML语句insert全表数据添加语句以及注意事项 官方语法: INSERT  INTO  表名 [(字段名列表)]  VALUES (值列表); 字段名是可选的,如省略则依次插入所有字段...ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; DML示例: # 一个井号是注释的意思 select * from student; # 添加语句...insert insert into student values (0,'2023-9-16 10:00:00','2023-9-28 10:00:00','乔俞雅', '123456','15612245679...',20,'女','信息安全1班大政委'); # insert语句使用总结 1、所有非中文内容均需要采用英文输入法写入 2、由于我们没有独立的写列信息,故而添加值数量一定与列数匹配 3、数字类型直接写...,否则书写错误 6、每一条sql语句结束都需要添加一个【;】代表书写完毕。

    1.2K10

    insert 语句加锁机制

    T_T 二 基础知识 在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略,来看看官方定义: "INSERT sets an exclusive lock on the inserted...via (MySQL REPLACE死锁问题深入剖析 )。 下面我们通过几个例子进行验证insert插入流程。业务上insert场景包含唯一索引和非唯一索引,本文也从这两个角度着手。...通过这样的逻辑来测试insert 语句遇到唯一键的时候的加锁流程。...(1) 我们从时间线维度分析: T1: insert into t7(id,a) values(26,10) 语句insert 成功,持有a=10 的X 行锁(X locks rec but not...T3: insert into t7(id,a) values(40,9)该语句插入的a=9的值在T1申请的gap锁(4,10]之间,Gap lock 阻塞insert intention lock,故要等待

    3.7K30

    MySQL实战中,Insert语句的使用心得总结

    喏 → MySQL专栏目录 | 点击这里   提到MySQL的Insert语句,你肯定不陌生,或许已经张口就来:不就是insert into table values(xxx,xxx,xxx)嘛!...1-3.插入或替换 1-4.插入或忽略 二、大量数据插入 2-1、三种处理方式 2-1-1、单条循环插入 2-1-2、修改SQL语句批量插入 2-1-3、分批量多次循环插入 2-2、插入速度慢的其他几种优化途径...对了,ON DUPLICATE KEY UPDATE为MySQL特有语法,比如在MySQL迁移Oracle或其他DB时,类似的语句要改为MERGE INTO语法,兼容性让人想骂街。...将100000条数据的插入速度提升到1-2分钟左右↓ 2-1-2、修改SQL语句批量插入 insert into user_info (user_id,username,password,price,hobby...例如我插入10w条数据的SQL语句要操作的数据包超过了1M,MySQL会报如下错: 报错信息: Mysql You can change this value on the server by setting

    2.6K20

    屠龙刀法35--使用SQL查询器批量生成insert语句

    很多网友认为SQL查询器的语句不都是人工输入或者从外面粘贴进去的吗?用查询器批量生成Insert语句感觉有点魔幻哦。的确听起来不太科学,但是对于DBCS来说这个功能的确非常好用。...这时候数据是以空白进行分隔的,距离我们的insert语句差了十万八千里。 第三步:选取数据,右键点击数据编辑如下图 第四步:在弹出的对话框中点击“结果预览”。...友情提示:这时候大家可以通过模板调整表名,在数据外部添加函数,甚至可以生成update等语句。...总结 DBCS查询器不但具备查询器常规功能,而且能够自定义生成SQL语句,从而减轻数据转换的麻烦,提升工作效率。

    19110

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

    问题反馈 用户反馈insert待入库的队列堆积,当前还有1000W+的insert在消息队列中等待入口,请求堆积严重,怀疑数据库性能有问题 [入库队列拥堵值] 用户质疑 分析如下两张图中的时间点,那么如果是因为大量合并...insert导致的IO瓶颈,那么下午两点的时候,宿主机IO负载降低到正常水平时,通过分析慢查询日志,发现insert指令执行反而更慢,拥塞反而更严重?...[错误码、业务量级、入库队列拥堵值] [实例维度以及宿主机维度的信息] 排查问题 show processlist发现,有大量合并后的批量insert 企业微信截图_440268d3-8ce4-4ca3...由于批量合并insert超出了吞吐极限,导致写了磁盘,导致了出现异常,异常原因及原理参考上面截图 -当宿主机IO负载降低到正常水平时,通过分析慢查询日志,发现insert指令执行反而更慢,拥塞反而更严重...合并量级调整,从200调整到50(客户已完成) 大量insert插入对宿主机磁盘IO性能要求较高,迁移至宿主机IO利用率低的迁移 该库还做运营查询,因为写入量太大,容易拥塞,建议读写分离 业务层做水平拆分

    2.4K40

    insert语句的加锁情况分析

    // insert语句的加锁情况分析 // 今天分享的内容是MySQL里面insert语句的加锁情况,废话就不多说了,直接从线上的例子开始吧。...`table_log` trx id B1354DEF lock mode AUTO-INC waiting 为了解释这个现象,我们需要知道在MySQL中,对于insert into select这个语句是如何加锁的...因此,为了避免这种情况发生,MySQL会在session 1中对表t添加了(-无穷,1]之间的next-key锁,来避免session2的insert语句并发插入。...MySQL认为这是欠妥当的,因此,对这种批量insert语句,包括load data等,它在内部做了一个自增值生成策略的优化: 1、批量执行的insert语句,第一次申请1个自增id 2、一个id用完了...解释下我们的例子,也就是: 当对表table_log进行insert操作的时候,会批量申请自增值,产生auto-inc的锁,由于MySQL不确定这个SQL会插入多少数据,而且我们设置了innodb_autoinc_lock_mode

    2.7K21
    领券