ご無沙汰です。
ちょっと思いつきでやってみました。
create table testtable
(
code varchar(10),
name varchar(10),
PRIMARY(code)
)
| code | name |
|00001|hoge |
| … |
|10000|hoge |
というテスト用のデータを用意。
SQLは
select name from testtable where code='09999'
PRIMARYとしてINDEXされているcodeカラムを対象に、1万件のデータを検索してたった1行×1カラムのデータを探します。
(一般的なベンチの手法とはかなり違うと思いますが)
DB接続の時間は含まずSQLを実行して、結果をフェッチして、その結果をvar_dumpするところまでの時間を計りました。
私の場合、WEBアプリでの利用が目的であって、実際にデータを取り出して使い回せる状態にするところまでDBアクセス層のお仕事だと思っているので。
また、自鯖ですがコマンドラインでなくApacheモジュール版PHPをブラウザから呼んで実行させています。
数字はPHPのmicrotime関数の出力を処理したもの。10回やった平均です。
PHP全体・鯖全体の負荷の問題もあるので数値としては全然正確じゃないと思いますが、一応の速度比較にはなるかと。
■結果
mysql関数:73.44マイクロ秒
PDO:113.49マイクロ秒
mysqli(クラス):51.28マイクロ秒
???:28.08マイクロ秒 ←
「???」って何だと思います?
実は、codeをキーに、nameを値に持つ連想配列を作って、$array['09999']が存在するかどうか調べて(isset)、存在すれば返す。という古典的な(?)方法のベンチです。
1万件の配列をメモリに読み込む方が、DBに問い合わせ投げるより早い!というのが意外でした。
(くだらなくてすみません;;)
今回扱いたいモノが、更新頻度があまり高くなく、読み込み頻度が圧倒的に高いデータなもので、こんな比較をしてみました。
更新のほうの処理を書くのがちと面倒ですが、配列ベースで実装しようかな、という結論に至りました。