简介
本文主要介绍通过压测数据来检验php7下pdo的各种fetch模式性能。
准备
- 一张5000条以上数据的表(批量数据生成)
测试用代码
<?php
// ***************需替换***************
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test_db;port=33062', 'root', 'pass');
// 性能检测脚本
function profile($text, $f) {
$testCount = 5000;
$totalTime = .0;
for($i = 0; $i < $testCount; ++$i){
$start = microtime(true);
$rows = $f();
$end = microtime(true);
$time = $end - $start;
$totalTime += $time;
}
$avg = $totalTime / $i;
printf("$text [ avg ] %1.6f [total] %3.6f \n", $avg, $totalTime);
}
// fetch 测试表(table_name)映射类 ***************需替换***************
class FetchClass {
public $id;
public $name;
public $created_at;
public $updated_at;
}
// ***************select * from table_name, table_name需替换***************
// 1 : 按行读取+返回一个索引为结果集列名的数组
profile("fetch ASSOC", function() use ($pdo) {
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_ASSOC);
$st->execute();
$rows = [];
while($row = $st->fetch()){
$rows[] = $row;
}
return $rows;
});
// 2 : 按行读取+返回一个属性名对应结果集列名的匿名对象
profile("fetch OBJ ", function() use ($pdo) {
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_OBJ);
$st->execute();
$rows = [];
while($row = $st->fetch()){
$rows[] = $row;
}
return $rows;
});
// 3 : 按行读取+返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定
profile("fetch CLASS", function() use ($pdo){
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_CLASS, 'FetchClass');
$st->execute();
$rows = [];
while($row = $st->fetch()){
$rows[] = $row;
}
return $rows;
});
// 4 : 按行读取+更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性
profile("fetch INTO ", function() use ($pdo){
$st = $pdo->prepare('select * from table_name');
$fetchCls = new FetchClass;
$st->setFetchMode(PDO::FETCH_INTO, $fetchCls);
$st->execute();
$rows = [];
while($row = $st->fetch()){
$rows[] = clone $row;
}
return $rows;
});
// 5 : 全部读取+返回一个索引为结果集列名的数组
profile("fetchAll ASSOC", function() use ($pdo) {
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_ASSOC);
$st->execute();
$rows = $st->fetchAll();
return $rows;
});
// 6 : 全部读取+返回一个属性名对应结果集列名的匿名对象
profile("fetchAll OBJ ", function() use ($pdo) {
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_OBJ);
$st->execute();
$rows = $st->fetchAll();
return $rows;
});
// 7 : 全部读取+返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名
profile("fetchall CLASS", function() use ($pdo){
$st = $pdo->prepare('select * from table_name');
$st->setFetchMode(PDO::FETCH_CLASS, 'FetchClass');
$st->execute();
$rows = $st->fetchAll();
return $rows;
});
测试结果
性能评价
- ASSOC==INTO>CLASS>OBJ
本文涉及源码
https://github.com/cangyan/TAV/tree/master/00025_PHP_PDO_FETCH