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 ]秒
从实际数据可以看到,预处理是会损失效率,而且还挺多。
这里提一下我的观点:编程语言的发展很多时候都是在降低执行效率,换取开发效率。所以,即使预处理会损失代码的执行效率也不用担心,大胆的用就好。毕竟,可以让你做事情更快。