PHP + MySQL批量插入测试

2016-08-25 Jamling 更多博文 » 博客 » GitHub »

PHP MySQL

原文链接 https://jamling.github.io/2016/08/25/PHP-php-mysql-mb-insert/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


使用PHP + MySQL来测试插入百万条数据,看看到底要多久。

<!-- more -->

测试代码

使用MySQL批处理即 insert table (field1, filed2...) values (value1, value2...), ... (value n1, value n2) 来插入数据。

<?php

include('init.php');

if(empty($db)) $db=DBConnect();

set_time_limit(0); // 执行时间超过30秒,wamp会中断执行。此方法不起作用。

// 先清空表
$db->execute("truncate table oc_project_content2");
// sql 插入语句
$sql = "insert into oc_project_content2 (gid, gname, fid, fname) values ";
// 分m次执行,一条n条
$m = 1000; $n = 1000;
$t1 = time(); // 开始计时
for($i=0; $i<$m; $i++){
  $arr = array();
  for($j=0; $j<$n; $j++) {
    $gid = ($i * $m + $j);
    $fid = 100;//rand(0, $m*$n)
    $arr[$j] = '('. $gid . ',"' . randStr(6) . '",' . $fid . ',"' . randStr(12) . '")';
  }//var_dump($arr);
  $tmp = join(',', $arr);
  $batch = $sql . $tmp;
  // var_dump($batch);
  $db->execute($batch);
}

$t2 = time();
echo $t2 - $t1 . ' s escaped ' . PHP_EOL; // 查看时间,单位秒

$count = $db->FirstRow("SELECT count(*) FROM `oc_project_content2`");
foreach ($count as $key => $value) {
  echo $key . '=>' . $value;
};

// 生成随机字符串
function randStr($m = 6) {
  $new_str = '';
  $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwsyz0123456789';
  $max=strlen($str)-1;
  for ($i = 1; $i <= $m; ++$i) {
    $new_str .=$str[mt_rand(0, $max)];
  }
  return $new_str;
}

?>

测试结果

以下是4次测试结果, 前3次是100x1000条数据,第4次是1000x1000条数据。

C:\wamp\www\test>..\..\bin\php\php5.3.10\php.exe api.php
11 s escaped
count(*)=>1000000
C:\wamp\www\test>..\..\bin\php\php5.3.10\php.exe api.php
12 s escaped
count( * )=>100000
C:\wamp\www\test>..\..\bin\php\php5.3.10\php.exe api.php
123 s escaped
count(*)=>1000000
C:\wamp\www\test>

** 1000x1000条数据,for循环组装sql的时间大约需要24s **

总结

MySQL果然强大哈,在我的工作机中,大约1秒能执行10000条插入操作。我的工作机配置不高,2.4G主频,而且开了一堆的软件包括相当吃内存的Android Studio, Eclipse等。

遇到的问题

  • Maximum execution time of 30 seconds exceeded 执行时间超过30秒,php会报错并中断执行。需要改php.ini设置并重启生效或者在命令行下执行。