php不同方法向mysql写入多条数据时的效率比对

php不同方法向mysql写入多条数据时的效率比对


DATA: 2018年07月13日 21:06:18

最近有读者 @pjlCSDN 在我的文章 php预处理方式向mysql中插入多条数据 留言提问:
这样做(php预处理)会对效率有影响吗?比如我插入一万条数据的时候。

回答这个问题,我不能想当然,所以在这里用几种实现做个实验。效率测试方法参考文章 php 测试 程序执行时间,内存使用情况

mysql数据库新建database,新建table

create database yixzm;

CREATE TABLE IF NOT EXISTS `guests`(
   `name` TEXT,   
   `email` TEXT
)ENGINE=yixzm DEFAULT CHARSET=utf8;

先来最笨的实现方式,每条数据执行一次SQL语句:

$servername = "localhost";
$username = "root";
$password = NULL;
$dbname = "yixzm";

$stime=microtime(true);

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

if ($conn->connect_error) {
        die("Connect Failed: " . $conn->connect_error);
}

for ($i=0; $i<10000; $i++) {
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('Sanji', 'sanji@onepiece.com', 'john@example.com');";
    $conn->multi_query($sql);
}

$conn->close();

$etime=microtime(true);//获取程序执行结束的时间
$total=$etime-$stime;   //计算差值
echo "<br />[页面执行时间:{$total} ]秒";

测试结果:[页面执行时间:1.182238817215 ]秒

使用常规方法,将SQL语句合并,在循环外一次执行。这里仅贴出SQL 相关代码

$sql = NULL;
for ($i=0; $i<10000; $i++) {
    $sql.= "INSERT INTO guests (name, email)
    VALUES ('nami', 'nami@onepiece.com');";
}
if ($conn->multi_query($sql) === TRUE) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

测试结果:[页面执行时间:0.0086851119995117 ]秒

最后,是@pjlCSDN 想知道的预处理方法:

//预处理,个人理解:封装数据库操作,简化多条数据场景下的提交过程
$stmt = $conn->prepare("insert into guests (name, email) values(?, ?)");
//i(int), s(string), d(double)
$stmt->bind_param("ss", $name, $email);

for ($i=0; $i<10000; $i++) {
    // add data to table
    $name = "Sanji";
    $email = "sanji@onepiece.com";
    $stmt->execute();
}

测试结果:[页面执行时间:0.39759397506714 ]秒

从实际数据可以看到,预处理是会损失效率,而且还挺多。

这里提一下我的观点:编程语言的发展很多时候都是在降低执行效率,换取开发效率。所以,即使预处理会损失代码的执行效率也不用担心,大胆的用就好。毕竟,可以让你做事情更快。

版权声明

弈心博客


本文首发site_name,转载请附上博文链接!