[[PHP]]

#contents

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

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

* PDO、PEAR::DB、MySQL関数の速度比較 [#o8b65db9]
2007年04月07日

** 実験環境 [#uc392158]
実験をしたサーバーの環境は、下表の通りです。
|環境 	|バージョン|
|OS 	|CentOS4|
|PHP 	|5.2.1|
|PHPアクセラレータ 	|eAccelerator0.9.5|
|MySQL 	|4.1|
|PEAR::DB 	|1.7.11|

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

** まとめ [#t4d869ef]
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を発行して処理速度比較を計測してから決めることも重要です。

* 考察 [#o6288f8d]
| 順位 | 手段 |h
| 1位 | mysqli関数 |
| 2位 | mysql関数 |
| 3位 | PDO |
| 4位 | PEAR::DB |

- mysqli関数 … MySQL4.1以上でOK、速い。
- PDO … SQLite等を使う場合、OOP/ORMを意識する場合、フレームワーク等の都合で。

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

* 参考 [#o381ea0d]
- mysqli (MySQL 改良版拡張モジュール)
http://www.php.net/manual/ja/book.mysqli.php
- PDO (PHP Data Objects)
http://php.net/manual/ja/book.pdo.php

第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