再求插入1亿条数据的最高效方法

epicure 2006-04-18 05:43:20
之前发过一篇帖子,询问过.但是觉得还是不满意.网上这种信息好像不是很多,特再次向高手请教.
之前的帖子的网址如下:
http://community.csdn.net/Expert/topic/4663/4663802.xml?temp=.4005243

我想问的问题是用第二种方法插入数据 186秒/万条。实在是太慢了,这样需要21.52天。
表中就两个字段就可以 indexNO as Integer,number as varchar(14)。
有人能提供更快的方法吗?希望有人能给与帮助。
...全文
312 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
epicure 2006-04-19
  • 打赏
  • 举报
回复
这个问题是彻底解决了,谢谢。
mathematician 2006-04-19
  • 打赏
  • 举报
回复
我没测完,就中止mysql了。因为我的E盘12G剩余空间一分钟内就变成3G了,如果不中止。。。呵呵!大数据量需要的硬件开销,有money才行呢! : )
epicure 2006-04-19
  • 打赏
  • 举报
回复
能问一下,你计算时间了吗?第四步花了多长时间?
我猜这是最高效的做法了,真的谢谢了。
mathematician 2006-04-19
  • 打赏
  • 举报
回复
具体一点:

1、先找个种子表,记录越多越好。与表中数据内容无关,因为我们只需要它的记录数。这里我用到的种子表是tb_dj_d_portcall,大约有3万条数据。
2、建立要产生1亿条记录的数据表
create table Number
(indexNO int not null auto_increment primary key,
number INT);
3、向表中插入数据
insert into Number(indexNO,number)
select null,(rand()*100+1) as number
from smis.tb_dj_d_portcall;
你会发现number表中产生了和种子表中总数量相同的记录,但数据内容为随机生成的。
4、继续插入,用cross join自连接:
insert into Number(indexNO,number)
select null,(rand()*100+1) as number
from number t1
cross join number t2;
这一步可以生成记录数为种子表的乘方,重复执行可以插入大量随机数据,不过有一点要注意:确保你的服务器可以承受这么大的数据量,还有日志表,可能会被填满,要注意增加日志空间。

我选的种子表有3万条数据,第四步仅执行了一次,就产生了30000×30000=900000000条数据,呵呵!生成大量测试数据,这是最简单的情况,仅仅对单表生成没有任何关联的数据。复杂一点的还有象父子表,表中数据存在逻辑关系等,会稍微麻烦一点,就不多说了。
epicure 2006-04-19
  • 打赏
  • 举报
回复
mathematician(数学家) ,你那样生成的不是重复的数据吗?虽然这也是一种好的办法,但是就单纯的插入而言难道就没有更好的办法了吗?
还有我觉得是不是由于机器的性能不行啊。
给我的感觉普通PC的性能不行,插入时硬盘灯一直闪个不停,所以,如果要真的是进行大量的数据操作还要使用服务器才行。
但是生成用于插入到数据库的数据的SQL语句文件的速度可是快的很,10万/2秒,要是往数据库里面插入数据能达到这个速度我就满意了,呵呵。
mathematician 2006-04-19
  • 打赏
  • 举报
回复
呵呵,看了你连接的帖子,提到的方法的确很慢。 : )

你需要先搞一个种子表,几百条几千条数据都行。然后用交叉连接,即CROSS JOIN,向表中插入,用insert into...select..很容易生成1亿条记录。
baby16 2006-04-18
  • 打赏
  • 举报
回复
http://yemao.com/info/file/4/0309/67_4.htm
不知道对你有用没?

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧