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

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

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

どもです。

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

膨大な行の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)