◆ ネットワークには勝てなかったよ
◆ メモリ上にDBを置く SQLite では php5 だとどっちもどっち
◆ SQLite でも php7 だとまとめて実行するほうが早い
◆ ネットワーク越しの MariaDB や postgres はまとめないとそれなりに遅い 

複数の ID で検索したいときに プログラム側で検索する ID をまとめて IN 句で書いて 結果を整形して と言う方法はよく?見ます
すごく無駄感があって個人的には余り好きじゃないです
とくに 「?」 とか 「: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);
}

こんなコードを用意しました

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

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

高速化された 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);
}

クラスが違うので多少メソッドが変わっていますが 基本は同じことをしています

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

ネットワークを通してる分 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

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);
}

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

毎回が遅いのは一緒ですが 全体的に 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

php5 と同じで mariadb よりちょっと早いくらい

まとめ

中央値でまとめるとこうなりました

PHP5
まとめてまとめて+処理毎回
sqlite30.0035970.0063010.004688
mariadb0.0042840.0069360.035818
postgres0.0034870.0064680.029626

PHP7
まとめてまとめて+処理毎回
sqlite30.0002880.0003290.000736
mariadb0.0013990.0014190.029308
postgres0.0010260.0011050.025708

やっぱりネットワーク越しになると 多数クエリ送るのは不利ですね
配列処理にかかる時間は php5 だと遅いですがそれでも思ったよりは早かったです

ですが 逆に 100 回もクエリ送って これだけの時間で結果が得られるともいえます
大量のアクセスもなくこれだけの速度があれば十分なら コードが短く綺麗にかける array_map で繰り返しを使うのもありかと思います