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

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

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

どもです。

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

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

些細と言い切るには、ちと数字が大きいですね。
やはり件数が多いときはresourceで持つのが吉か。mysql系の関数は集約したかったのだけど、残念(;´・ω・)


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

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