首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 事务插入大量数据

基础概念

MySQL事务是一组一起执行或都不执行的SQL语句。事务的主要目的是确保数据的一致性和完整性。在MySQL中,事务支持ACID(原子性、一致性、隔离性、持久性)属性。

相关优势

  1. 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  3. 隔离性:事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不会互相干扰。
  4. 持久性:一旦事务提交,则其结果就是永久的,即使系统崩溃也不会丢失。

类型

MySQL支持两种事务隔离级别:

  1. 读未提交(Read Uncommitted)
  2. 读已提交(Read Committed)
  3. 可重复读(Repeatable Read)(MySQL默认隔离级别)
  4. 串行化(Serializable)

应用场景

当需要执行一系列数据库操作,并且这些操作要么全部成功,要么全部失败时,事务非常有用。例如,在银行转账过程中,从一个账户扣除金额并同时向另一个账户添加金额,这两个操作必须作为一个事务来处理。

插入大量数据的挑战与解决方案

挑战

当尝试在一个事务中插入大量数据时,可能会遇到以下问题:

  1. 内存不足:大量的数据可能会导致内存溢出。
  2. 锁竞争:长时间持有锁可能会导致其他事务等待,降低系统性能。
  3. 超时:默认情况下,MySQL有一个事务超时时间,超过这个时间事务会被自动回滚。

解决方案

  1. 批量插入:将数据分批插入,而不是一次性插入所有数据。
代码语言:txt
复制
START TRANSACTION;
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
-- 插入更多批次的数据
COMMIT;
  1. 调整超时时间:可以通过设置innodb_lock_wait_timeoutwait_timeout来调整超时时间。
代码语言:txt
复制
SET GLOBAL innodb_lock_wait_timeout = 120; -- 设置锁等待超时时间为120秒
SET GLOBAL wait_timeout = 28800; -- 设置全局等待超时时间为8小时
  1. 优化索引:确保表上的索引是优化过的,以减少插入操作的开销。
  2. 使用存储过程:编写一个存储过程来处理批量插入,这样可以更好地控制事务和错误处理。
  3. 考虑分区表:如果表非常大,可以考虑使用分区表来分散数据和负载。

参考链接

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

相关·内容

mysql批量插入大量数据「建议收藏」

mysql批量插入大量数据 时间:2020年11月25日 今天遇到了一个批量插入大量数据任务,然后出于小白本能,直接for-each循环插入不就好了,于是手上开始噼里啪啦一顿操作,写好了从读取excel...到插入数据库的工作,于是就美滋滋的开始了自己的测试,试了一把,一次通过perfect,然后后面就悲剧了,后面发现数据量稍微大一点,速度就会很慢很慢。...1w条数据进行比较 1w条数据插入了11s,比上面不知道快了多少,可是这样插入是有一个弊端的,就是数据量再大一点的话,会报错的,我改成10w去跑一下给你们看一下效果 ### Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException...进行插入、更新或查询操作时,mysql server接收处理的数据包大小是有限制的,如果太大超过了设置的max_allowed_packet参数的大小,会导致操作失败,我们可以通过命令:show VARIABLES...MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。

3.8K10

hive 插入大量数据

Hive 插入大量数据简介在大数据领域中,Hive是一个常用的数据仓库工具,可以方便地对大规模数据进行管理和分析。当需要将大量数据插入到Hive表中时,我们需要考虑一些优化策略,以提高插入性能和效率。...使用分区表在向Hive表中插入大量数据时,可以考虑使用分区表。通过对数据进行合理的分区,可以减少单个分区数据量,提高查询性能。同时,在插入数据时,Hive会并行处理不同分区的数据,加快插入速度。...启用动态分区插入动态分区插入是一种优化策略,可以让Hive自动根据数据中的字段值进行分区,避免手动指定分区,简化操作。在插入大量数据时,动态分区插入可以提高效率。...调整参数设置在插入大量数据时,可以通过调整Hive的参数设置来优化性能。...结语通过以上优化策略,我们可以提高在Hive中插入大量数据的效率和性能,加快数据处理过程。在实际应用中,根据数据量大小和业务需求,可以灵活选择合适的优化方式,以达到最佳的数据处理效果。

42610
  • Python使用SQLite插入大量数据

    而当大量插入爬取的数据时,出现了严重的耗时,查看一起资料后,发现:sqlite在每条insert都使用commit的时候,就相当于每次访问时都要打开一次文件,从而引起了大量的I/O操作,耗时严重。...下面是每次插入后,提交事务处理,每次插入的时间,单位是秒。...在批量插入数据之后再进行事务提交,把大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次,会显著的提高效率。...sqlite3.Error as why: print "insert data failed:", why.args[0] # 批量插入之后再执行事务提交...0.143000125885 0.12299990654 0.128000020981 0.121999979019 0.203999996185 写同步和执行准备方法 这两种方法主要参考提升SQLite数据插入效率低

    3.4K10

    MYSQL 大量插入数据失败后,磁盘空间却被占用

    最近有人问,在MYSQL大量插入数据失败后,磁盘空间被占用了不少,然后磁盘空间到底怎么样, 我们先模拟一下这个环节. 先找一个大表,或者现生成一个 #!.../usr/bin/python3 # -*- coding: UTF-8 -*- import mysql.connector from mysql.connector import errorcode...通过上面的信息我们大致知道 这个48MB的磁盘空间里面的数据,共占用了 3072 PAGES ,B-tree node 使用了 2461 , 估计熟悉MYSQL的小伙伴们,头脑里面已经有了那个 树形的图...' FROM information_schema.TABLES where table_schema='test' and table_name='test_p'; 从上面的脚本中我们获得,仅仅插入的表中...下面我们来进行这个测试 我们让数据插入,人为的失败.在看磁盘空间的占用方式,的确,数据插入成功和失败占用的磁盘空间并没有差. 由于计算方式,上图给出的datafree 并不准.

    1.3K10

    MySQL 插入数据

    MySQL 表中使用 INSERT INTO SQL语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。...语法 以下为向MySQL数据插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...fieldN )...---- 通过命令提示窗口插入数据 以下我们将使用 SQL INSERT INTO 语句向 MySQL 数据表 runoob_tbl 插入数据 实例 以下实例中我们将向 runoob_tbl 表插入三条数据...接下来我们可以通过以下语句查看数据数据: 读取数据表: select * from runoob_tbl; 输出结果: mysql6.jpg 使用PHP脚本插入数据 你可以使用PHP 的 mysqli_query...可以是下列值中的任意一个:MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认) MYSQLI_USE_RESULT(如果需要检索大量数据

    5.8K10

    MyBatis批量插入大量数据(1w以上)

    问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。...,但是他的灵界点并不高,插入数据过多的时候,可能需要我们使用代码在一次分批。...当然如果插入数据不超过5000的时候可以直接这么使用 插入1w条数据,发现出现错误,原因是数据量过大,栈内存溢出了。...mybatis中直接使用foreach插入数据,就相当于将所有的sql预先拼接到一起,然后一起提交。这本身就是一种批量插入的处理方案,但是达不到我们要求。主要是插入有上限。...,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的; 插入大量数据的解决方案,使用ExecutorType 为了能够高效,并且解决上述问题,我们使用ExecutorType,并分批插入

    1.9K20

    MySQL插入优化篇——(少量插入数据优化&批量插入数据load指令)

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...数据库提供的load指令进行插入。...本地磁盘文件中的数据,通过load直接加载到数据库表结构中 操作如下: #客户端连接服务端时,加上参数--local-infile mysql --local-infile -u root -p #设置全局参数...批量处理:对于大量插入操作,将它们封装在一个事务中可以显著提高性能,因为数据库只需在事务结束时进行一次磁盘写入操作,而不是每次插入都写入。...3.主键顺序插入 在大多数数据库系统中,如表数据是使用B树(或其变种如B+树)这样的数据结构进行索引的。 顺序插入可以减少 页分裂 相应博客传送门

    8110

    Mysql高效插入更新数据

    从tushare抓取到的财务数据,最开始只是想存下来,用的办法想简单点,是:插入--报错—update 但发现这个方法太蠢,异常会导致大量无效连接,改为: for idx,row in...fldname,row[colname],row["code"],dat) except: log.errorlogger().exception("数据入库错误...运行没啥大问题,但就是太慢,取两年数据,万条左右,一早上还没全部入库。...只得研究优化,结果发现mysql居然有专门的语法,可以插入记录,遇到重复记录则为自动更新: ON DUPLICATE KEY UPDATE 上面的处理直接用一条sql语句就解决了: INSERT INTO...: # d2:待入库dataframe,第一列为code,第二列为数值 # dat:时间 # fldname:数据在库中的字段名 def addtodb(d2,dat,fldname):

    2.7K50

    Mysql高效插入更新数据

    从tushare抓取到的财务数据,最开始只是想存下来,用的办法想简单点,是:插入--报错—update 但发现这个方法太蠢,异常会导致大量无效连接,改为: for idx,row in...fldname,row[colname],row["code"],dat) except: log.errorlogger().exception("数据入库错误...运行没啥大问题,但就是太慢,取两年数据,万条左右,一早上还没全部入库。...只得研究优化,结果发现mysql居然有专门的语法,可以插入记录,遇到重复记录则为自动更新: ON DUPLICATE KEY UPDATE 上面的处理直接用一条sql语句就解决了: INSERT INTO...: # d2:待入库dataframe,第一列为code,第二列为数值 # dat:时间 # fldname:数据在库中的字段名 def addtodb(d2,dat,fldname):

    3K70
    领券