有什么快速生成1000万条数据并插入mysql数据库的方法?

我用insert into插入,加for循环1000万次。但是笔记本操作起来太卡了。大神有更好的方法吗?

阅读 15.4k
16 个回答

用脚本生成数据文件,以"\t"或者","分割!
mysql load data infile 方式通过文件导入数据!

insert into肯定是不行。。。。

在CLI模式下用PHP异步每分钟生成10000条数据插入,100分钟即可完成.

你可以换换不同的存储引擎试试,MyISAM 要比 Innodb 具有更高的插入速度,我之前测试的结果是,插入100万条数据,innodb 用了15分钟左右,而myisam用时50秒!

使用事务,例如每 5000 条数据作为一个事务提交,效率是不使用事务的几十上百倍。

这是如何利用内存的技巧.
1000万数据一次性插入表?
呵呵, 包你整台服务器卡的只能重启.

给每次查询量定个上限量, 如一万, 那么可拆分成1000个查询包
可以稳定地单线程循环跑完这1000个包
如果数据无顺序依赖, 要高速点, 就并发或多线程, 如分成10个worker去跑, 每worker就只用跑100包, 且是并行的

insert into tablename select * from tablename

多执行几次就好了.

1.要看插入内容的,只是单纯的数字字母信息会快一点,
2.其次如果数据库空中没有太多索引也会好一点
3.如果mysql是在固态硬盘内,读写会更快一点
4.但是最关键还是要看你内存和CPU频率

注意,应该尽量使用一条带很多values的insert 语句,而不是多条insert into
其他并无特别好的办法

一千万条数据还是比较多的,可以分开几次插入,然后把每次插入的值拼成一条 sql 语句执行

分多次插入吧。用触发器。

建多张表,多线程插入,然后合并这些表。

多进程执行,建议看下pcntl_fork函数

原回答
那些说用异步,循环什么,个人觉得不合理.
10w条数据啊,你就算内存够大,数据存进数据库里也会占用很多时间(IO流),甚至如果事务提交没处理好数据库也会占用内存.

直接在数据库里直接生成数据才是最快的办法.
自己生成一张id表(只存id一个字段),记录10w条(0-10w)
mysql做法:

insert into table t
select i.id, concat('名字', i.id) name, 
    concat('随机生成码7-12:',FLOOR(7 + (RAND() * 6))) rand,
    ifnull(a.nickname, 'No nickname') nickname,
    uuid() descript, --随机字符串
    from_unixtime(unix_timestamp("20170101000000")+FLOOR((RAND()*60*60*24*365)))  --2017年中随机日期
from table_id i
left join table_account a on a.id=FLOOR((RAND()*12)) --如果数据来源另外一些表
where i.id < 1000  --如果只要生成1000条

为什么不用存储过程呢?怎么感觉存储过程会好一些!

果断存储过程啊,再者就用异步的方式执行脚本,每次异步回调的时候就把脚本重启一次,直到满足条件的时候就停止

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题