我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL批量SQL插入性能优化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL批量SQL插入性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。

经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。

1、一条SQL语句插入多条数据

常用的插入语句如: 

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  2.     VALUES ('0', 'userid_0', 'content_0', 0);  
  3. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  4.     VALUES ('1', 'userid_1', 'content_1', 1); 

修改成: 

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  2.     VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1); 

修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。

这里提供一些测试对比数据,分别是进行单条数据的导入与转化成一条SQL语句进行导入,分别测试1百、1千、1万条数据记录。

2、在事务中进行插入处理

把插入修改成: 

  1. START TRANSACTION;  
  2. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  3.     VALUES ('0', 'userid_0', 'content_0', 0);  
  4. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  5.     VALUES ('1', 'userid_1', 'content_1', 1);  
  6. ...  
  7. COMMIT; 

使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。

这里也提供了测试对比,分别是不使用事务与使用事务在记录数为1百、1千、1万的情况。

3、数据有序插入

数据有序的插入是指插入记录在主键上是有序排列,例如datetime是记录的主键: 

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  2.     VALUES ('1', 'userid_1', 'content_1', 1);  
  3. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  4.     VALUES ('0', 'userid_0', 'content_0', 0);  
  5. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  6.     VALUES ('2', 'userid_2', 'content_2',2); 

修改成: 

  1. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  2.     VALUES ('0', 'userid_0', 'content_0', 0); 
  3. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  4.     VALUES ('1', 'userid_1', 'content_1', 1);  
  5. INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
  6.     VALUES ('2', 'userid_2', 'content_2',2); 

由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。我们可以参照InnoDB使用的B+tree索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

下面提供随机数据与顺序数据的性能对比,分别是记录为1百、1千、1万、10万、100万。

从测试结果来看,该优化方法的性能有所提高,但是提高并不是很明显。

4、性能综合测试

这里提供了同时使用上面三种方法进行INSERT效率优化的测试。

从测试结果可以看到,合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。

注意事项:

  1.  SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。
  2.  事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL批量SQL插入性能优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL批量SQL插入性能优化

经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。

Android批量插入数据性能优化

做数据同步时遇到一个问题,在下载数据时需要批量的向sqlite插入数据,虽然数据不算多,但是实际测试中每插入一条数据需要将近50ms的时间,这意味着1000条数据需要花费50s左右的时间,对于用户来说,体验太差了,必须要优化。在sqlite
2022-06-06

ORM框架如何优化MySQL的批量插入

ORM(Object-Relational Mapping)框架是数据库和对象模型之间的桥梁,它允许开发者以面向对象的方式操作数据库。在使用ORM框架进行批量插入时,可以通过以下方法来优化MySQL的性能:使用批量插入语句:大多数ORM框架
ORM框架如何优化MySQL的批量插入
2024-10-05

MyBatis iterate实现批量插入优化

MyBatis 的 iterate 方法允许你执行批量插入操作,但是默认情况下,这种操作可能会受到数据库的限制。为了优化批量插入操作,你可以采取以下措施:使用 JDBC 批处理(Batch Processing):在 MyBatis 中,
MyBatis iterate实现批量插入优化
2024-09-19

Mongodb 插入、批量插入和分页查询性能测试

处理器名称: Intel Core i7 处理器速度: 2.5 GHz 处理器数目: 1 核总数: 4 L2 缓存(每个核): 256 KB L3 缓存: 6 MB 内存: 16 GB 测试软件环
Mongodb 插入、批量插入和分页查询性能测试
2020-11-23

MyBatis批量插入数据优化,那叫一个优雅!

我们使用了 mybatis-plus 框架,并采用其中的 saveBatch 方法进行批量数据插入。然而,通过深入研究源码,我发现这个方法并没有如我期望的那样高效。

Oracle中怎么优化大量数据插入的性能

在Oracle中优化大量数据插入的性能,可以采取以下几种方法:使用批量插入:使用INSERT INTO … SELECT语句将数据一次性插入到目标表中,而不是逐条插入。这样可以减少插入操作的次数,提高插入性能。禁用或延迟索引:在插入大量数据
Oracle中怎么优化大量数据插入的性能
2024-04-19

SQL查询优化-MySQL 性能调优

  在进行库表结构设计时,我们要考虑到以后的查询要如何的使用这些表,同样,编写 SQL 语句的时候也要考虑到如何使用到目前已经存在的索引,或是如何增加新的索引才能提高查询的性能。  想要对存在性能问题的查询进行优化,需要能够找到这些查询,下面先看下如何获取有性能问题的SQL。  如何设计最优的数据库表结构,如何建立最好
SQL查询优化-MySQL 性能调优
2024-04-18

MySQL插入锁与数据库性能调优的自动化

MySQL插入锁是一种锁机制,用于在执行INSERT操作时保护数据的完整性。在MySQL中,插入锁会锁定整个表,以确保在插入数据时不会发生并发冲突。对于数据库性能调优的自动化,可以通过使用MySQL的性能调优工具和脚本来实现。这些工具和脚
MySQL插入锁与数据库性能调优的自动化
2024-08-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录