PHP生成百万个UID存入文件、插入数据库
2015-07-22 18:54
507 查看
这是今天一个群里问的问题,主要是写入文件耗时大。
贴下代码
这里也要换一个方式
我一开始插入100万条的sql语句是:
拼接插入语句的话:
这样插入100万条数据的时间只有5S而已。差距非常大,这样插入效率高的原理就是:
是大大减少了解析sql语句时间
是减少了sql语句的长度,减少网络的IO
然而我试了下一次插入2000条和插入50000条时间上没多大差别,但是要注意的是sql语句别超过你mysql配置的最大sql语句长度:max_allowed_packet
网上还有的朋友说是使用事务也可以。但是这么庞大数据,如果插入失败事务回滚也是非常不划算的。
贴下插入数据库php代码
写入文件
我这里做一个实验,每20000个UID写入一个文件,大概一个文件写入是大概280kb,这样总体写入的时间只有13S贴下代码
<?php set_time_limit(0); $starttime = time(); $fh = fopen($filename,'w'); for($i=0;$i<1000000;$i++) { $uid = uniqid(); if($i%20000 == 0) { $filename = $i.'.txt'; } fwrite($fh,$uid.' '); } $endtime = time(); echo '总用时:'.($endtime-$starttime).'s'; ?>
插入数据库
如果百万条数据插入数据库的话也是非常耗时的。我做了一个测试,两个字段(id,message) insert一百万跳数据需要280多S,可想而知,如果是多个字段,大文字字段插入的话会更耗时间。这里也要换一个方式
我一开始插入100万条的sql语句是:
insert into t(id,message) values(1,'hello1'); insert into t(id,message) values(2,'hello2');
拼接插入语句的话:
insert into t(id,message) values(1,'hello1'),(2,'hello2');
这样插入100万条数据的时间只有5S而已。差距非常大,这样插入效率高的原理就是:
是大大减少了解析sql语句时间
是减少了sql语句的长度,减少网络的IO
然而我试了下一次插入2000条和插入50000条时间上没多大差别,但是要注意的是sql语句别超过你mysql配置的最大sql语句长度:max_allowed_packet
网上还有的朋友说是使用事务也可以。但是这么庞大数据,如果插入失败事务回滚也是非常不划算的。
贴下插入数据库php代码
<?php ##直接插入100W条 用时286S ##每次sql 2000插入用时5s ##每次sql 50000 插入用时5s set_time_limit(0); include_once('mysql_class.php'); $starttime = time(); $db = new mysql('localhost','root','','test','','utf8'); for($i=0;$i<1000000;$i++) { if($i %50000 ==0) $sql = "insert into t4(message) values"; else $sql .= ','; $num = $i+1; $sql .= "('msg_{$num}')"; if($num %50000 ==0) { $db->query($sql); } } $endtime = time(); echo '总用时:'.($endtime-$starttime).'s'; ?>
相关文章推荐
- error:unknow filesystem grub rescue
- Cursor query
- soapui中文操作手册(一)----创建一个新的项目
- Android酷炫实用的开源框架(UI框架)
- js检测元素value改变
- UIView中常见的方法总结
- 编译apk的时候提示value for 'keystore' is not valid
- 2015 Multi-University Training Contest 1 - 10010 Y sequence
- 使用JS获取多组radio的value并判断是否选中
- WIZnet助力Arduino中文社区第三届开源硬件开发大赛!
- Snail—UI学习之UILabel
- HDU 4740——The Donkey of Gui Zhou
- [Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations) 5
- 【iOS学习】三、利用UIBezierPath绘图
- iPhone之为UIView设置阴影(CALayer的shadowColor,shadowOffset,shadowOpacity,shadowRadius,shadowPath属性)
- 1051. Pop Sequence
- easyui datagrid 的分页刷新按钮
- The different between ng-grid & ui-grid
- Cause: java.sql.SQLException: Column count doesn't match value count at row 1
- 全面解释java中StringBuilder、StringBuffer、String类之间的关系