mysql 插入百万级数据 简单靠谱的方法

来源:互联网 发布:网络报警平台或中心 编辑:程序博客网 时间:2024/06/13 11:44

之前学习mysql的时候,想要试着插入百万、千万级别的测试数据,看了下网上的不少博客,基本都是复制copy,大多数都是用个存储过程就直接循环插入。。
比如:

drop table if exists test;create table test (c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL);drop PROCEDURE if exists test_insert;delimiter //CREATE PROCEDURE test_insert()      begin          declare v int default 0;            while v < 800         do              insert into test               values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));              set v = v + 1;          end while;      end //

这里就先插800条试试水。。

这里写图片描述


结果800条就用了半分钟,简直不能忍啊

经过查阅不少信息,发现每次insert的时候mysql都会自动提交,然后会有其他的一些耗时的操作,所以。。。。。取消掉自动提交不就好了嘛。。。直接 SET AUTOCOMMIT=0;
代码如下:

drop table if exists test;create table test (c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL);drop PROCEDURE if exists test_insert;delimiter //CREATE PROCEDURE test_insert(n int)      begin          declare v int default 0;        SET AUTOCOMMIT=0;               while v < n         do              insert into test               values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));              set v = v + 1;          end while;        SET AUTOCOMMIT=1;           end //

试试800条


这里写图片描述


秒秒钟的事
继续加大量8千、8万、80万。。。1千万。。


这里写图片描述


1千万只用的3分钟(100万10多秒就差不多了)
验证哈插入的数据


这里写图片描述


数量正确,数据也没问题,大功告成!


———————————————————-分割线————————————————————————



然后又发现个更简单的方法。。直接用insert into … select … from …就行了
也就是不停地复制表里的数据,再插入

drop table if exists test2;create table test2 (c1 int(11) default NULL,c2 varchar(30) default NULL);insert into test2 values(1,'a'),(2,'b'),(3,'c');insert into test2 select * from test2;

看看效果

这里写图片描述

这里写图片描述



百万级也就是几十秒到一两分钟的事


当然,要在java里用jdbc写代码也行,尽量避免循环insert操作,最好先拼接好sql,一次执行,毕竟每次都io太耗时,也可以把自动提交给关了,调用conn.setAutoCommit(false),再循环插。。



over

0 0
原创粉丝点击