您的位置:首页 > 数据库 > MySQL

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

2017-04-12 11:27 225 查看
之前学习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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: