PHPでMySQLにアクセスするとき、どうすれば速くなるのかな?
検索したら、以下のような実験結果が報告されていました。
http://zapanet.info/blog/item/972
2007年04月07日
実験をしたサーバーの環境は、下表の通りです。
環境 | バージョン |
OS | CentOS4 |
PHP | 5.2.1 |
PHPアクセラレータ | eAccelerator0.9.5 |
MySQL | 4.1 |
PEAR::DB | 1.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 |
とりあえず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