快速批量插入1个亿的数据,适合大部分数据库的方法

Posted webmote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速批量插入1个亿的数据,适合大部分数据库的方法相关的知识,希望对你有一定的参考价值。

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【掘金】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

序言

干大事,需要学会分解目标。

插入1个亿,可以分解为插入10个1000w数据,进而分成插入100个100w数据…

那么让我们从小研究,怎么插入100条数据?

1. 批量插入几百条数据

对大部分数据库来说,批量插入数据都是比较简单的事情,最简单的方法无非是写好一条insert into语句,通过简单的复制和拷贝,就可以瞬间搞定100条插入数据。

然后借助sql的带界面的管理工具,比如Navicat系列,我们可以迅速执行这些语句,多次执行就可以产生成百上千条数据量了。

那么怎么搞定几百万数据呢? 一直靠点击执行,是不是太累了?

2.批量插入几百万条数据

数据库几乎都有存储过程功能,在存储过程内均支持一定的语法,来支持for循环,我们只需要利用这个功能,把我们的数据写到存储过程中,那么几百万甚至上千万的数据也不是问题。

CREATE OR REPLACE PROCEDURE "public"."InsertChar10001"()
 AS $BODY$BEGIN
	declare 
		campaignId varchar(32):='';
		autoInvitationId varchar(32):='';
		siteId int:=0;
		sentNum int:=0;
		acceptNum int:=0;
		refuseNum int:=0;
		logTime timestamptz:='2010-01-01 00:00:00.000';
		rand int:=0;
		ncount int:=0;
		ifQueued int:=ceil(random()*(2-1)+1);
		status int:=ceil(random()*(5-1)+1);
		nsource int:=0;
		preChatSocialMediaSource int:=0;
		preChatTicketId int:=0;
		visitorMessagesCount int:=0;
		ii int;
		ss timestamptz:=logtime;
		randTime varchar(50) := to_char(logTime, 'YYYY-MM-DD HH24:MI:SS');
		
		begin
			ii:=1;
			for ii in 1..1000000 loop
				INSERT INTO "T_TEST"
           ("Id","SessionId"
           ,"StartTime"
           ,"EndTime"
          )
		   		   
     select
				    uuid_generate_v4() Id,
            uuid_generate_v4() SessionId
           ,logTime StartTime
           ,logtime + interval '100 second'  EndTime
           ;
					 
			end loop;			
		end;
	
   


END$BODY$
  LANGUAGE plpgsql

只要我们调节参数 for ii in 1..1000000,那么我们就可以自由定制数据量的大小,精确的生成随机数据到表内。

问题又来了,这么执行,生成几百万的数据,速度换可以接受,但是1000w以后,很多数据库都出现了问题,速度非常慢,有的甚至需要好几个小时才能生成数据。

那么怎么办呢?

3. 万能方法

牢记秘诀: insert into ... select ...。 几乎所有数据库都支持,并且速度都很快!

使用这个方法可以翻倍表内的数据,比如100w到200w,200w到400w… ,唯一的弊端就是有大量重复的数据。

INSERT INTO "T_TEST"
           ("Id",
	   "SessionId"
           ,"StartTime"
           ,"EndTime")

	select uuid_generate_v4() "Id",
			     "SessionId"
           ,"StartTime"
           ,"EndTime" from "T_TEST"

如果想精确复制的条数,可以利用 类似 select top n方式指定数据量,或者 where条件等等,自己自由组合吧。

需要注意的是,你的数据库容量需要足够哦,看我就出错了。

4. 小结

8月更新完毕,其实还是蛮困难的,写到最后都不知道写啥了,生成速度完全跟不上啊。

例行小结,理性看待!

结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?

以上是关于快速批量插入1个亿的数据,适合大部分数据库的方法的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 入门与实战:仿一个微信价值几个亿的页面

将数据批量插入 Oracle 数据库的最佳方法

哪种方法最适合批量插入?

初识 mycat

使用JDBC在MySQL数据库中快速批量插入数据

mongodb数据库批量插入海量数据时为啥有少部分数据丢失