ど素人から毛を生やす。<延>

MySQLをPHPでSELECTしたとき、resource型で保持して使用するときにwhileするのと一度配列にぶち込んでforeachするのとで、どれくらい負荷と速度に差があるのか調べてみた。

Web > PHP 2018年12月7日(最終更新:5年前)

2018年12月7日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

つい昨日、こんなことを呟きました。

膨大な行のMySQLをPHPでSELECTしたとき、resource型で保持して使用するときにwhileするのと一度配列にぶち込んでforeachするのとで、どれくらい負荷と速度に差があるのか知りたい。
いや前者の方が良いのはわかるんだけど!可能なら後者でいきたいんだ!

ということで、調べます。
PHPバージョンは5.4.15、Linuxサーバーです。

材料:
1万行×11カラムのテスト用テーブル


$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);

$q = "SELECT * FROM `test_dummy`";
/* 共通なので略:MySQLにアクセスして$result(リソース)を取得 */

//1.resource型で保持して使用するときにwhileする
while($rows = mysql_fetch_assoc($result)){
$rows["column1"] = "123";
}

//2.一度配列にぶち込んでforeachする
$re = array();
while($rows = mysql_fetch_assoc($result)){
$re[] = $rows;
}
foreach($re as $k => $v){
$re["column1"] = "123";
}

$maxMemoryUsage = (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024);
$processTime = microtime(true) - $baseTime;

printf("Max Memory Usage : %.3f [MB]\n", $maxMemoryUsage);
printf("Process Time : %.2f [s]\n", $processTime);

結果
1. Max Memory Usage : 5.978 [MB] Process Time : 0.06 [s]
2. Max Memory Usage : 21.941 [MB] Process Time : 0.08 [s]

何度か試行しましたが、誤差は殆どなし。だいたいこの数値で良いでしょう。

1万行程度じゃあ速度にはほぼ影響なしかぁ。
ただしメモリは約4倍。
たぶん1万行×11カラムをそのまま配列にして16MBなのでしょう。resource型って容量食わないんですね…

1万行を一気に捌くような事態は想定にありませんが、起こり得る事態の対策をしないのは宜しくない。
やはり件数が多いときはresourceで持つのが吉か。mysql系の関数は集約したかったのだけど、残念(;´・ω・)


☆計測方法はこちらのQiitaから拝借しました。
[PHP]ループのメモリ使用量と処理速度を比較しました

この記事は役に立ちましたか?
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)
  • _(:3」∠)_ 面白かった (1)