公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上。目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标。

到MySQL官方网站查了查资料,发现MySQL支持在一条INSERT语句中插入多条记录,格式如下:
INSERT table_name (column1, column2, ..., columnN)
VALUES (rec1_val1, rec1_val2, ..., rec1_valN),
(rec2_val1, rec2_val2, ..., rec2_valN),
... ...
(recM_val1, recM_val2, ..., recM_valN);

按MySQL官方网站,用这种方法一次插入多条数据,速度比一条一条插入要快很多。在一台开发用的笔记本电脑上做了个测试,果然速度惊人。

测试环境:DELL Latitude D630, CPU T7250 @ 2.00GHz, 内存 2G。Windows XP Pro中文版SP2,MySQL 5.0 for Windows。

MySQL是新安装的,建立了一个名为test的数据库,在test数据库建了一个t_integer表,共两个字段:test_id和test_value,两个字段都是INTEGER类型,其中test_id是Primary Key。

准备了两个SQL脚本文件(写了个小程序生成的),内容分别如下:

-- test1.sql
TRUNCATE TABLE t_integer;
INSERT t_integer (test_id, test_value)
VALUES (1, 1234),
(2, 1234),
(3, 1234),
(4, 1234),
(5, 1234),
(6, 1234),
... ...
(9997, 1234),
(9998, 1234),
(9999, 1234),
(10000, 1234);
-- test2.sql
TRUNCATE TABLE t_integer;
INSERT t_integer (test_id, test_value) VALUES (1, 1234);
INSERT t_integer (test_id, test_value) VALUES (2, 1234);
INSERT t_integer (test_id, test_value) VALUES (3, 1234);
INSERT t_integer (test_id, test_value) VALUES (4, 1234);
INSERT t_integer (test_id, test_value) VALUES (5, 1234);
INSERT t_integer (test_id, test_value) VALUES (6, 1234);
... ...
INSERT t_integer (test_id, test_value) VALUES (9997, 1234);
INSERT t_integer (test_id, test_value) VALUES (9998, 1234);
INSERT t_integer (test_id, test_value) VALUES (9999, 1234);
INSERT t_integer (test_id, test_value) VALUES (10000, 1234);

以上两个脚本通过mysql命令行运行,分别耗时0.44秒和136.14秒,相差达300倍。

基于这个思路,只要将需插入的数据进行合并处理,应该可以轻松达到每秒1000条的设计要求了。

补充:以上的测试都是在InnoDB表引擎基础上进行的,而且是AUTOCOMMIT=1,对比下来速度差异非常显著。之后我将t_integer表引擎设置为MyISAM进行测试,test1.sql执行时间为0.11秒,test2.sql为1.64秒。

补充2:以上的测试均为单机测试,之后做了跨机器的测试,测试客户端(运行脚本的机器)和服务器是不同机器,服务器是另一台笔记本,比单机测试时配置要好些。做跨机器的测试时,发现不管是InnoDB还是MyISAM,test1.sql速度都在0.4秒左右,而test2.sql在InnoDB时且AUTOCOMMIT=1时要80多秒,而设置为MyISAM时也要20多秒。

转载于:https://blog.51cto.com/ylj798/1061860

MySQL大批量数据插入相关推荐

  1. mysql大批量数据插入技巧

    转自:https://jingyan.baidu.com/album/95c9d20d61b01dec4f75615a.html?picindex=6 首先我是简单的写了一个mysql的循环插入数据的 ...

  2. c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法

    通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 而打开事务的话,一秒不到就搞定了! 具体实现代码如下: #include #include ...

  3. Mysql字符集数据插入问题(Incorrect string value ‘xE2x80xA2xE6xBCxAB...‘ for column ‘rname‘ at row 1)

    Mysql字符集数据插入问题(Incorrect string value: '\xE2\x80\xA2\xE6\xBC\xAB-' for column 'rname' at row 1) 一.问题 ...

  4. TOAD FOR MYSQL 进行数据插入时乱码的解决办法---MariaDB 5.5

    最近使用mysql是发现插入的数据乱码,几经周折终于找到的解决方法,特作备忘. 开始有将mysql的字符集全部设置成utf8,如下: SHOW VARIABLES LIKE 'character_se ...

  5. mysql大量数据插入探讨(量变引起质变)

    2019独角兽企业重金招聘Python工程师标准>>> 分类:见Visio图 关于大量数据导入是应注意以下几点: 分批导入,导入一批后最后提交(commit),可以使用jdbc的(e ...

  6. mysql 大量数据插入优化

    1.一条SQL语句插入多条数据 修改后的插入操作能够提高程序的插入效率.这里第二种SQL执行效率高的主要原因是: (1)通过合并SQL语句,同时也能减少SQL语句解析的次数,减少了数据库连接的I/O开 ...

  7. Mysql大批量数据导入ElasticSearch

    注:笔者环境 ES6.6.2.linux centos6.9.mysql8.0.三个节点.节点内存64G.八核CPU 场景: 目前Mysql 数据库数据量约10亿,有几张大表1亿左右,直接在Mysql ...

  8. mysql 批量数据插入很慢(kettle 输入输出组件) 性能优化办法

    背景 最近在做数仓重构项目,遇到一些性能瓶颈,这里记录一下解决办法. 随着业务数据每天都在增加,几年前开发的etl任务开始跑不动了.大表一般是通过增量的方式插入,但是修复bug 或者每月/季度跑一次的 ...

  9. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

最新文章

  1. java 数据结构 无向图_数据结构-无向图
  2. 车道线检测算法经典编程
  3. AI算法效率每16个月提速一倍,算力革命超越摩尔定律
  4. Maven坐标和依赖(三)
  5. 远程登录linux进程的状态_Linux实操篇 - 远程登录到Linux系统
  6. 用Excel制作改进前后漏斗模型图比较
  7. 红外热成像拥抱无人机 迸发安防救援新活力
  8. linux与s7-300,Siemens SIMATIC S7-300硬编码凭证安全限制绕过漏洞
  9. poj 2987 Firing (最大权 闭合 图)
  10. maven ojdbc6和ojdbc8 jar包下载地址
  11. 智慧校园视频监控管理系统平台建设的详情分析
  12. 2021年起重机械指挥考试资料及起重机械指挥理论考试
  13. 论文翻译:2021_语音增强模型压缩_Performance optimizations on deep noise suppression models...
  14. 解析MTK获取系统时间函数大全
  15. matlab读取bin文件
  16. java do po dto_彻底搞懂DAO,PO,BO,DTO,VO,DO
  17. 蓝芽技术的原理和应用(2)(转)
  18. 七月上(歌词背后的故事)
  19. 论DNS地址8.8.8.8和114.114.114.114
  20. 三角形形状判断(等边、等腰、直角、等腰直角、非等边)

热门文章

  1. iOS 关于关键字高亮
  2. 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题
  3. hive实现not in
  4. SimpleAdapter类使用方法
  5. Dubbo使用启动时检查 check=“true“
  6. SQLServer基础:Apply关键字用法介绍
  7. 【原创】SQlServer数据库生成简单的说明文档小工具(附源码)
  8. 面向对象和面向过程_程序员给你解释:面向对象和面向过程的区别,到底是怎么回事?...
  9. 苹果手机6s运营商在哪里显示无服务器,iPhone6s信号很弱或无服务如何解决【解决方法】...
  10. python爬虫面试题