PHP生成百万个UID存入文件、插入数据库

9 篇文章 0 订阅

这是今天一个群里问的问题,主要是写入文件耗时大。

写入文件

我这里做一个实验,每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而已。差距非常大,这样插入效率高的原理就是:

  1. 是大大减少了解析sql语句时间
  2. 是减少了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';
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值