クエリキャッシュ
ページ全体やページの一部をキャッシュすることが適切でない場合もあります。このような場合も、クエリをキャッシュすることによりパフォーマンスを 大幅に向上することが可能です。ここでもSquidを使用すると、高性能なクエリキャッシュシステムを簡単に構築できます(図21)。キャッシュヒット率 が高いデータをキャッシュさせると、高い効果が期待できます。

図21:クエリキャッシュ
PHPについては、リモートファイルの読み込みをサポートしているため、リスト9、リスト10のようなスクリプトを用意します。
リスト9:サーバー側PHPスクリプトの例(出力はSquidにキャッシュ)
// query_result.php
// 600秒間キャッシュを許可
header('Cache-Control: public, max-age=600');
$db = pg_connect('dbname=foo');
$rec = pg_select($db, 'somedb', $_GET);
// PHPがスクリプトとして読み込み可能な
// 形式でレコード変数を出力
echo '
var_export($rec);
echo '?>';
?>
リスト10:クライアント側PHPスクリプトの例
include(‘http://some_db_cache _server/query_result.php?id=1234');
var_dump($rec); // query_ result.phpで設定された変数をダンプ
?>
キャッシュの効果
これまで紹介してきたキャッシュがどの程度の効果があるか、簡単なベンチマークを行ってみます。テストに利用したのは次のスペックのPCです。データベースサーバー、Webサーバー、キャッシュサーバー、クライアントとして使用しました。
- 環境 … PC3台
- CPU … Pentium 4 2.4GHz
- メモリ … 1GB
- HDD … UATA 133/7200rpm
- NIC … 100Mbps(スイッチングHUBへ接続)
データベースのデータには、日本郵政公社が公開している郵便番号情報(http://www.post.japanpost.jp/zipcode/download.html)を、PostgreSQLに登録して使用しました。データ件数は約12万件あります。
テストには、自作したPHPスクリプトおよびab(Apache Bench)コマンドを使用しました。abコマンドを使用したテストでは、コマンドは外部の別のPCから実行し、「ab -c 100 -n 10000