SQL はまとめて実行したほうがいいの?
◆ ネットワークには勝てなかったよ
◆ メモリ上にDBを置く SQLite では php5 だとどっちもどっち
◆ SQLite でも php7 だとまとめて実行するほうが早い
◆ ネットワーク越しの MariaDB や postgres はまとめないとそれなりに遅い
◆ メモリ上にDBを置く SQLite では php5 だとどっちもどっち
◆ SQLite でも php7 だとまとめて実行するほうが早い
◆ ネットワーク越しの MariaDB や postgres はまとめないとそれなりに遅い
複数の ID で検索したいときに プログラム側で検索する ID をまとめて IN 句で書いて 結果を整形して と言う方法はよく?見ます
すごく無駄感があって個人的には余り好きじゃないです
とくに 「?」 とか 「:id」 みたいので置き換える機能を使うと 特殊なことをしないと IN の中を書けないですし
ID 検索なんてインデックスついてるものならひとつひとつの ID 検索が高速なので ID の配列に対して map でそれぞれに対して where id=? な SQL 毎回実行すればシンプルでいいんじゃないの?と思います
ネイティブな言語ならともかく スクリプト系な言語から DB アクセスしてるなら言語側より RDB 側のほうが単純な処理速度は早そうですし PRIMAY KEY な ID をインデックス使って検索するの繰り返しても プログラム側で配列やオブジェクトを色々繰り返し処理して整形するより早いんじゃないのって思うんです
言語は DB 接続が比較的楽な PHP にしました
PHP といえばとりあえず SQLite かな とまずは SQLite で試してみます
こんなコードを用意しました
test10 は配列を IN 句の形式に変換してる SQL を一回だけにしてるものです
test11 は test10 に加えて結果を元の配列の順に戻す処理をしています
test20 は array_map 内で SQL を実行して配列の要素数だけクエリが投げられるものです
PHP は 5 系 と 7 系の 2 バージョンで動かしてみました
test10 のほうが test20 より早いという結果になりました
test11 と比べると test20 のほうが早いです
元々の配列の順に戻すなどの処理が多いなら 毎回 SQL 実行したほうが早いですが それほど処理がいらないなら まとめて実行でもよさそうです
今回はシンプルなものでしたが 一度に取れない 複数の結果を結合したりとか複雑になってくれば 毎回クエリ実行してもいいかもしれません
高速化された 7 系の PHP だとまた結果が違います
多少配列処理で順番を直しても 速度はまとめて実行するほうが早いです
ぱっと見て 3 つめの test20 は php7 で遅くなったように見えますが よくみると桁が 1 つ違っているんです
php7 の高速化はすごいですね
あくまで これはインメモリの SQLite の結果です
ネットワークを通すと クエリが増えるごとに速度差がおおきくなってくるはずです
mysqli を使っています
ネットワークを通して家の中の別 PC に接続しています
クラスが違うので多少メソッドが変わっていますが 基本は同じことをしています
ネットワークを通してる分 array_map で毎回 ID に対してクエリ投げるのは遅くなっています
一回しか投げないものは DB がメモリ上にある SQLite と対して違いが無いです
SQLite よりは遅いですが 思ったより早いです
まとめて投げたほうが良いのは一緒です
PC は mariadb のと同じのにあります
postgres の接続は mysqli みたいなオブジェクト指向なものがなくて手続き型のみでした
書くのが少し面倒ではありますが その分高速です
毎回が遅いのは一緒ですが 全体的に mariadb よりちょっとだけ早め
php5 と同じで mariadb よりちょっと早いくらい
PHP5
PHP7
やっぱりネットワーク越しになると 多数クエリ送るのは不利ですね
配列処理にかかる時間は php5 だと遅いですがそれでも思ったよりは早かったです
ですが 逆に 100 回もクエリ送って これだけの時間で結果が得られるともいえます
大量のアクセスもなくこれだけの速度があれば十分なら コードが短く綺麗にかける array_map で繰り返しを使うのもありかと思います
すごく無駄感があって個人的には余り好きじゃないです
とくに 「?」 とか 「:id」 みたいので置き換える機能を使うと 特殊なことをしないと IN の中を書けないですし
ID 検索なんてインデックスついてるものならひとつひとつの ID 検索が高速なので ID の配列に対して map でそれぞれに対して where id=? な SQL 毎回実行すればシンプルでいいんじゃないの?と思います
ネイティブな言語ならともかく スクリプト系な言語から DB アクセスしてるなら言語側より RDB 側のほうが単純な処理速度は早そうですし PRIMAY KEY な ID をインデックス使って検索するの繰り返しても プログラム側で配列やオブジェクトを色々繰り返し処理して整形するより早いんじゃないのって思うんです
SQLite3
とりあえず試してみればいいのです言語は DB 接続が比較的楽な PHP にしました
PHP といえばとりあえず SQLite かな とまずは SQLite で試してみます
<?php
$db = new SQLite3(':memory:');
$db->exec('DROP TABLE IF EXISTS testspd');
$db->exec('CREATE TABLE testspd (id INTEGER PRIMARY KEY, str TEXT)');
$db->exec("
insert into testspd values
(77025, 'NzcwM'),
(78123, 'NzgxM'),
(17527, 'MTc1M'),
(31357, 'MzEzN'),
/* 略 */
";
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$result = $stmt->execute();
$res = [];
while($row = $result->fetchArray(SQLITE3_ASSOC)){
$res[] = $row;
}
return $res;
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$result = $stmt->execute();
// 元の順にする
$table = [];
while($row = $result->fetchArray(SQLITE3_ASSOC)){
$table[(int)$row['id']] = $row;
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = :id';
$stmt = $db->prepare($sql);
return array_map(function($id) use (&$stmt) {
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$result = $stmt->execute();
return $result->fetchArray(SQLITE3_ASSOC);
}, $ids);
}
$db = new SQLite3(':memory:');
$db->exec('DROP TABLE IF EXISTS testspd');
$db->exec('CREATE TABLE testspd (id INTEGER PRIMARY KEY, str TEXT)');
$db->exec("
insert into testspd values
(77025, 'NzcwM'),
(78123, 'NzgxM'),
(17527, 'MTc1M'),
(31357, 'MzEzN'),
/* 略 */
";
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$result = $stmt->execute();
$res = [];
while($row = $result->fetchArray(SQLITE3_ASSOC)){
$res[] = $row;
}
return $res;
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$result = $stmt->execute();
// 元の順にする
$table = [];
while($row = $result->fetchArray(SQLITE3_ASSOC)){
$table[(int)$row['id']] = $row;
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = :id';
$stmt = $db->prepare($sql);
return array_map(function($id) use (&$stmt) {
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$result = $stmt->execute();
return $result->fetchArray(SQLITE3_ASSOC);
}, $ids);
}
こんなコードを用意しました
test10 は配列を IN 句の形式に変換してる SQL を一回だけにしてるものです
test11 は test10 に加えて結果を元の配列の順に戻す処理をしています
test20 は array_map 内で SQL を実行して配列の要素数だけクエリが投げられるものです
PHP は 5 系 と 7 系の 2 バージョンで動かしてみました
PHP 5.6.7 (cli) (built: Mar 19 2015 15:10:53)
test10
max: 0.004673
min: 0.003158
ave: 0.003684
med: 0.003597
test11
max: 0.007075
min: 0.005511
ave: 0.006264
med: 0.006301
test20
max: 0.005741
min: 0.003711
ave: 0.004709
med: 0.004688
max: 0.004673
min: 0.003158
ave: 0.003684
med: 0.003597
test11
max: 0.007075
min: 0.005511
ave: 0.006264
med: 0.006301
test20
max: 0.005741
min: 0.003711
ave: 0.004709
med: 0.004688
test10 のほうが test20 より早いという結果になりました
test11 と比べると test20 のほうが早いです
元々の配列の順に戻すなどの処理が多いなら 毎回 SQL 実行したほうが早いですが それほど処理がいらないなら まとめて実行でもよさそうです
今回はシンプルなものでしたが 一度に取れない 複数の結果を結合したりとか複雑になってくれば 毎回クエリ実行してもいいかもしれません
PHP 7.0.2 (cli) (built: Jan 6 2016 13:00:05) ( ZTS )
max: 0.000394
min: 0.000221
ave: 0.000294
med: 0.000288
max: 0.000369
min: 0.000325
ave: 0.000340
med: 0.000329
max: 0.000775
min: 0.000724
ave: 0.000739
med: 0.000736
min: 0.000221
ave: 0.000294
med: 0.000288
max: 0.000369
min: 0.000325
ave: 0.000340
med: 0.000329
max: 0.000775
min: 0.000724
ave: 0.000739
med: 0.000736
高速化された 7 系の PHP だとまた結果が違います
多少配列処理で順番を直しても 速度はまとめて実行するほうが早いです
ぱっと見て 3 つめの test20 は php7 で遅くなったように見えますが よくみると桁が 1 つ違っているんです
php7 の高速化はすごいですね
あくまで これはインメモリの SQLite の結果です
ネットワークを通すと クエリが増えるごとに速度差がおおきくなってくるはずです
MariaDB (Mysql): mysql Ver 15.1 Distrib 10.0.23-MariaDB
次は mariadb ですmysqli を使っています
ネットワークを通して家の中の別 PC に接続しています
<?php
$dbhost = 'fedora';
$dbport = 3306;
$dbuser = 'root';
$dbpass = '';
$dbname = 'test1';
$db = new mysqli($dbhost, $dbuser, $dbpass, $dbname, $dbport);
if ($db->connect_error) {
die('Connect Error (' . $db->connect_errno . ') ' . $db->connect_error);
}
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$stmt->execute();
$stmt->bind_result($id, $str);
$res = [];
while($stmt->fetch()){
$res[] = ['id' => $id, 'str' => $str];
}
return $res;
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$stmt->execute();
$stmt->bind_result($id, $str);
// 元の順にする
$table = [];
while($stmt->fetch()){
$table[(int)$id] = ['id' => $id, 'str' => $str];
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = ?';
$stmt = $db->prepare($sql);
return array_map(function($id) use (&$stmt) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($bind_id, $bind_str);
$stmt->fetch();
return [$bind_id, $bind_str];
}, $ids);
}
$dbhost = 'fedora';
$dbport = 3306;
$dbuser = 'root';
$dbpass = '';
$dbname = 'test1';
$db = new mysqli($dbhost, $dbuser, $dbpass, $dbname, $dbport);
if ($db->connect_error) {
die('Connect Error (' . $db->connect_errno . ') ' . $db->connect_error);
}
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$stmt->execute();
$stmt->bind_result($id, $str);
$res = [];
while($stmt->fetch()){
$res[] = ['id' => $id, 'str' => $str];
}
return $res;
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$stmt = $db->prepare($sql);
$stmt->execute();
$stmt->bind_result($id, $str);
// 元の順にする
$table = [];
while($stmt->fetch()){
$table[(int)$id] = ['id' => $id, 'str' => $str];
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = ?';
$stmt = $db->prepare($sql);
return array_map(function($id) use (&$stmt) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($bind_id, $bind_str);
$stmt->fetch();
return [$bind_id, $bind_str];
}, $ids);
}
クラスが違うので多少メソッドが変わっていますが 基本は同じことをしています
PHP 5.6.7 (cli) (built: Mar 19 2015 15:10:53)
test10 まとめて
max: 0.005664
min: 0.004058
ave: 0.004506
med: 0.004284
test11 まとめて+配列処理
max: 0.008272
min: 0.006273
ave: 0.006999
med: 0.006936
test20 毎回
max: 0.039221
min: 0.034290
ave: 0.036066
med: 0.035818
max: 0.005664
min: 0.004058
ave: 0.004506
med: 0.004284
test11 まとめて+配列処理
max: 0.008272
min: 0.006273
ave: 0.006999
med: 0.006936
test20 毎回
max: 0.039221
min: 0.034290
ave: 0.036066
med: 0.035818
ネットワークを通してる分 array_map で毎回 ID に対してクエリ投げるのは遅くなっています
一回しか投げないものは DB がメモリ上にある SQLite と対して違いが無いです
PHP 7.0.2 (cli) (built: Jan 6 2016 13:00:05) ( ZTS )
test10 まとめて
max: 0.001792
min: 0.001234
ave: 0.001449
med: 0.001399
test11 まとめて+配列処理
max: 0.001613
min: 0.001302
ave: 0.001439
med: 0.001419
test20 毎回
max: 0.030686
min: 0.028459
ave: 0.029410
med: 0.029308
max: 0.001792
min: 0.001234
ave: 0.001449
med: 0.001399
test11 まとめて+配列処理
max: 0.001613
min: 0.001302
ave: 0.001439
med: 0.001419
test20 毎回
max: 0.030686
min: 0.028459
ave: 0.029410
med: 0.029308
SQLite よりは遅いですが 思ったより早いです
まとめて投げたほうが良いのは一緒です
postgres 9.4.6
同じくネットワークを通した postgres ですPC は mariadb のと同じのにあります
postgres の接続は mysqli みたいなオブジェクト指向なものがなくて手続き型のみでした
書くのが少し面倒ではありますが その分高速です
<?php
$dbhost = 'fedora';
$dbport = 5432;
$dbuser = 'postgres';
$dbpass = 'postgres';
$dbname = 'test';
$db = pg_connect("host={$dbhost} port={$dbport} dbname={$dbname} user={$dbuser} password={$dbpass}");
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$prep = pg_prepare($db, '', $sql);
$result = pg_execute($db, '', []);
return pg_fetch_all($result);
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$prep = pg_prepare($db, '', $sql);
$result = pg_execute($db, '', []);
// 元の順にする
$table = [];
while ($row = pg_fetch_assoc($result)) {
$table[(int)$row['id']] = $row;
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = $1';
$prep = pg_prepare($db, '', $sql);
return array_map(function($id) use (&$db) {
$result = pg_execute($db, '', [$id]);
return pg_fetch_assoc($result);
}, $ids);
}
$dbhost = 'fedora';
$dbport = 5432;
$dbuser = 'postgres';
$dbpass = 'postgres';
$dbname = 'test';
$db = pg_connect("host={$dbhost} port={$dbport} dbname={$dbname} user={$dbuser} password={$dbpass}");
$ids = [77025, 78123, 17527, 31357, /* 略 */];
for($i=0;$i<10;$i++){
measure10($db, $ids);
measure11($db, $ids);
measure20($db, $ids);
}
function measure10($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test10($db, $ids);
$e = microtime(true);
echo "measure1-1: " . ($e - $s) . "\n";
}
function measure11($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test11($db, $ids);
$e = microtime(true);
echo "measure1-2: " . ($e - $s) . "\n";
}
function measure20($db, $ids){
$s=0;$e=0;
$s = microtime(true);
test20($db, $ids);
$e = microtime(true);
echo "measure2-1: " . ($e - $s) . "\n";
}
function test10($db, $ids){
$ids = array_map(function($e){return (int)$e;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$prep = pg_prepare($db, '', $sql);
$result = pg_execute($db, '', []);
return pg_fetch_all($result);
}
function test11($db, $ids){
$ids = array_map(function($id){return (int)$id;}, $ids); // 今回リテラルだけど
$str_ids = join(',', $ids);
$sql = "SELECT id, str FROM testspd WHERE id IN ({$str_ids})";
$prep = pg_prepare($db, '', $sql);
$result = pg_execute($db, '', []);
// 元の順にする
$table = [];
while ($row = pg_fetch_assoc($result)) {
$table[(int)$row['id']] = $row;
}
return array_map(function($id) use($table) {
return $table[$id];
}, $ids);
}
function test20($db, $ids){
$sql = 'SELECT id, str FROM testspd WHERE id = $1';
$prep = pg_prepare($db, '', $sql);
return array_map(function($id) use (&$db) {
$result = pg_execute($db, '', [$id]);
return pg_fetch_assoc($result);
}, $ids);
}
PHP 5.6.7 (cli) (built: Mar 19 2015 15:10:53)
test10 まとめて
max: 0.004185
min: 0.003180
ave: 0.003642
med: 0.003487
test11 まとめて+配列処理
max: 0.007028
min: 0.005640
ave: 0.006434
med: 0.006468
test20 毎回
max: 0.034251
min: 0.027972
ave: 0.030515
med: 0.029626
max: 0.004185
min: 0.003180
ave: 0.003642
med: 0.003487
test11 まとめて+配列処理
max: 0.007028
min: 0.005640
ave: 0.006434
med: 0.006468
test20 毎回
max: 0.034251
min: 0.027972
ave: 0.030515
med: 0.029626
毎回が遅いのは一緒ですが 全体的に mariadb よりちょっとだけ早め
PHP 7.0.2 (cli) (built: Jan 6 2016 13:00:05) ( ZTS )
test10 まとめて
max: 0.002210
min: 0.000900
ave: 0.001164
med: 0.001026
test11 まとめて+配列処理
max: 0.001172
min: 0.000940
ave: 0.001090
med: 0.001105
test20 毎回
max: 0.028605
min: 0.024876
ave: 0.026119
med: 0.025708
max: 0.002210
min: 0.000900
ave: 0.001164
med: 0.001026
test11 まとめて+配列処理
max: 0.001172
min: 0.000940
ave: 0.001090
med: 0.001105
test20 毎回
max: 0.028605
min: 0.024876
ave: 0.026119
med: 0.025708
php5 と同じで mariadb よりちょっと早いくらい
まとめ
中央値でまとめるとこうなりましたPHP5
まとめて | まとめて+処理 | 毎回 | |
sqlite3 | 0.003597 | 0.006301 | 0.004688 |
mariadb | 0.004284 | 0.006936 | 0.035818 |
postgres | 0.003487 | 0.006468 | 0.029626 |
PHP7
まとめて | まとめて+処理 | 毎回 | |
sqlite3 | 0.000288 | 0.000329 | 0.000736 |
mariadb | 0.001399 | 0.001419 | 0.029308 |
postgres | 0.001026 | 0.001105 | 0.025708 |
やっぱりネットワーク越しになると 多数クエリ送るのは不利ですね
配列処理にかかる時間は php5 だと遅いですがそれでも思ったよりは早かったです
ですが 逆に 100 回もクエリ送って これだけの時間で結果が得られるともいえます
大量のアクセスもなくこれだけの速度があれば十分なら コードが短く綺麗にかける array_map で繰り返しを使うのもありかと思います