定型的なデータはmySQLから読み込むより配列に保存してincludeした方が50%程度速い
phpでサーバーのAPIを作ったりしている時にずっと気になっている事があります。
それはmysqlなどのデータベースに接続するパフォーマンスのコストです。
ある程度定型的なデータを想定して、テーブルデータを配列で持った場合と、データベースに接続して値を取得する場合でどれくらいパフォーマンスが違うのかを比較してみます。
(memchachdなどのキャッシュサーバーを使うと最も高速なのかもしれませんが今回は比較対象として考慮していません。)
■想定事例
・テーブルデータは1日に一度変更される。
・テーブルデータの基となるデータはmysqlに保存されている。
・テーブルデータは1000件程度と想定。
・テーブルデータからランダムに値を抽出してレスポンスを返すPHPプログラム
・データベースのテーブルはInnoDB
■配列の場合
・1日1回、cron等でデータベースに接続して配列用PHPを出力するプログラムを実行
・phpが実行されたら配列用PHPをincludeしてレスポンスを作成
■データベース接続の場合
・phpが実行されるたびにデータベースに接続してテーブルデータを取得してレスポンスデータを作成
■配列の場合
<?php $start_time = microtime(); //事前に出力した配列を読み込み include('/var/www/html/test_array.inc'); shuffle($test_array); $id = $test_array[0]; $temp = array(); $temp['id'] = $id; $result = array(); $result['results'] = $temp; $dat = json_encode($result); echo($dat); $end_time = microtime(); echo($end_time - $start_time); ?>
■データベース接続の場合
<?php $start_time = microtime(); // DB接続 if(! $conn = mysql_connect( DB_HOST, DB_USER, DB_PASS ) ){ die( 'データベース接続エラー' ); } mysql_select_db( DB_NAME, $conn ); $charsql = "SET NAMES utf8"; mysql_query( $charsql, $conn ) or die("Query error ".$charsql."<br>".mysql_error()); $sql = "SELECT id FROM test ORDER BY RAND()LIMIT 1;"; $res = mysql_query( $sql, $conn ) or die("Query error ".$sql."<br>\n".mysql_error()); $row = mysql_fetch_assoc( $res ); mysql_free_result( $res ); $temp = array(); $temp['id'] = $row['id']; $result = array(); $result['results'] = $temp; $dat = json_encode($result); echo($dat); $end_time = microtime(); echo($end_time - $start_time); ?>
■それぞれ100回計測した結果
・配列を読み込んだ場合の平均
0.000584
・データベースに接続した場合の平均
0.000894
やはりと言うか、当然なのかもしれませんが静的な配列の方が50%程度速かったです。
実装の手間や仕様変更などの対応も考慮するとテーブルデータはDBで管理した方が良いでしょうが
どうしてもパフォーマンスを出したくてキャッシュサーバーが無い場合に使える方法かなと思いました。