PHP

PHPでMySQLにアクセスするとき、どうすれば速くなるのかな?
検索したら、以下のような実験結果が報告されていました。

http://zapanet.info/blog/item/972

PDO、PEAR::DB、MySQL関数の速度比較

2007年04月07日

実験環境

実験をしたサーバーの環境は、下表の通りです。

環境バージョン
OSCentOS4
PHP5.2.1
PHPアクセラレータeAccelerator0.9.5
MySQL4.1
PEAR::DB1.7.11

実験結果

やはりネイティブ関数は速く、mysqli関数が一番速い結果になりました。
続いて同じくネイティブ関数のmysql関数が続き、その次にPDOという結果になりました。
PDOでは、プリペアドステートメントを用いてSQLを発行したため、2回目のSQLの発行ではキャッシュが効き、劇的な速さになっています。
一番遅かったのは予想通り、PEAR::DBでした。
ネイティブ関数よりも2~3倍遅く、PDOよりも2倍近く遅い結果となりました。
PHP用アクセラレータを導入していなければ、PEAR::DBはもっと遅くなっただろうと考えられます。

まとめ

PHP5を利用していて、DBの抽象化を行いたいのであれば、PEAR系のモジュールはやめてPDOにした方が良いと言えます。
単純なSELECT文の結果でさえ、2倍近い性能差が出ていますから当然です。

DBの抽象化を行う必要がない場合、PDOを使うかネイティブ関数を使うか迷うところですが、状況に応じて使い分けるのが良いと思います。
PDOは、対象データベースがMySQL 3.x/4.x/5.xを始め、PostgreSQL、SQLite 3、SQLite 2、FreeTDS、Microsoft SQL Server、Sybase、Firebird/Interbase 6、IBM DB2、Oracle Call Interfaceなどの大量のデータベースに対応しています。
他のDBも扱う予定があるのならば、PDOの処理だけを覚えてしまうのが簡単です。

一方、処理速度がボトルネックとなっていて、DBを変更する予定もないのであればネイティブ関数のmysqli関数でチューニングするという方向で良いと思います。
PDOは、PEAR::DBのように圧倒的に遅いわけではないので、状況に応じて選べば良いと思います。
当然、そのサーバーで扱うデータを元に、それぞれのSQLを発行して処理速度比較を計測してから決めることも重要です。

考察

順位手段
1位mysqli関数
2位mysql関数
3位PDO
4位PEAR::DB
  • mysqli関数 … MySQL4.1以上でOK、速い。
  • PDO … SQLite等を使う場合、OOP/ORMを意識する場合、フレームワーク等の都合で。

とりあえずPDOを使ってみて、遅いようならmysqli関数でベタ書きすればOK?

参考

第260話 PEAR DB,MySQLiからPDOへ
http://itpro.nikkeibp.co.jp/article/MAG/20070904/281168/

PDOでサクサクDB開発
http://codezine.jp/article/detail/433

MySQL⇔PHPベンチマーク(mysql_・PDO・mysqli)+おまけ
http://php-sql-gdgd.jugem.jp/?eid=65


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-03-27 (日) 15:38:09 (2457d)