A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[学习交流] PHP批量插入优化

© mangoboy 中级黑马   /  2018-9-30 20:04  /  1102 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

测试环境:phpstudy
PHP 5.6.27 + mysql 5.6+apache 2.4
我的表结构如下:
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userindex` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

第一种-》传统for循环插入:核心代码如下

<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname  = 'test';
// 创建连接

$conn = new mysqli($servername,$username,$password,$dbname);
$start = time();
// 传统插入
for ($x=0; $x<=200000; $x++) {
        $sql = 'insert into user (userindex) values ('.$x.')';
        $conn->query($sql);
}
$end = time();
echo '传统插入耗时:'.($end-$start);
//关闭连接
$conn->close();

?>  


测试耗时:
传统for循环插入222222223.png
第二种方法:使用事务提交,批量插入数据库(每隔5W条提交下)
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname  = 'test';
// 创建连接


$conn = new mysqli($servername,$username,$password,$dbname);
$start = time();


$conn->query('BEGIN');
for($i=0;$i<100000;$i++){
        $sql = 'insert into user (userindex) values ('.$i.')';
        $conn->query($sql);
        if($i%50000==0){
                $conn->query('COMMIT');
                $conn->query('BEGIN');
        }
}




$end = time();
echo '分段事务插入耗时:'.($end-$start);
//关闭连接
$conn->close();


?>  
测试耗时:
分段事务处理插入.png
第三种方法:使用优化SQL语句:将SQL语句进行拼接

<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname  = 'test';
// 创建连接


$conn = new mysqli($servername,$username,$password,$dbname);
$start = time();


$sql= "insert into user (userindex) values";
for($i=0;$i<100000;$i++){
        $sql.="('$i'),";
}
// 去除最后一个逗号
$sql = substr($sql,0,strlen($sql)-1);


$conn->query($sql);


$end = time();
echo 'sql语句拼接插入耗时:'.($end-$start);
//关闭连接
$conn->close();


?>  

测试耗时:
sql插入时间耗时000000000000.png
三种批量插入比较之下你应该知道哪一种才是更好的了。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马