この記事は最終更新から6年以上経過しています。内容が古くなっている可能性があります。
PHP で使用できる MySQL 用ドライバについて
マニュアルにかかれている様にPHP には MySQL を操作するためのドライバ(拡張モジュール)が複数あります
また、それらの拡張モジュールは mysqlnd と libmysqlclient ライブラリのいずれかを使用することができます
目的
上記の様に PHP で使用出来る MySQL ドライバは複数存在し、それぞれについて利用できる機能も異なっています
しかし、今回は単純に MySQLへの接続〜SELECT〜切断 といった一連の操作においての速度差を比較検証してみたいと思います
また、かなり古いですが PEAR ライブラリにも DB 接続を行うライブラリがありますので、PEAR::MDB2 についても同様の検証を行いたいと思います
単純な速度検証を行うため、プリペアドステートメントやmysqlndのクエリキャッシュプラグインといった機能は使用していません
また、php.ini もデフォルト状態で行っています
また、php.ini もデフォルト状態で行っています
目次
検証環境(AWS 環境にて作成)
- PHP 実行サーバ
- c4.large(2vCPU, 3.75GiB)
- CentOS 7.2.1511
- DB サーバ(RDS for MySQL)
- db.m4.large
- MySQL 5.7.19
- default.mysql5.7
検証する組み合わせ
- PHP
- PHP 5.4.16(OS デフォルトパッケージ)
- PHP 5.5.38(REMI パッケージ)
- PHP 5.6.34(REMI パッケージ)
- PHP 7.0.28(REMI パッケージ)
- PHP 7.1.15(REMI パッケージ)
- PHP 7.2.3(REMI パッケージ)
- 拡張ライブラリ
- php-mysql(mysqlnd と依存関係があるため、相互にインストール・アンインストールを行いました)
- php-mysqlnd(mysql と依存関係があるため、相互にインストール・アンインストールを行いました)
- PEAR::MDB2
- MDB2-mysql 1.5.0(EPEL パッケージ)
- MDB2-mysqli 1.5.0(EPEL パッケージ)
php-mysql は REMI でインストール出来る PHP 5.5 以上には存在しなかったため、PHP 5.4.16 のみで検証
検証方法
- 検証データは sysbench を使い、単一テーブルに 50,000,000 件のデータを作成しています
- ランダムに PK でアクセスし、50 件のレコードを取得する処理を1,000回繰り返し、10回分の平均を求めています
- コードは必要最低限レベルで記述していますので、エラーハンドリング等は行っていません
- PHP 7 系ではリファレンス参照で Notice が出てしまいますが、無視して実行しています
- PHP 7.2.3 では count(): Parameter must be an array or an object that implements Countable の警告が出力されてしまいますが、こちらも無視して実行しています
PHP ソースコード
検証結果(単位:秒)
ドライバ・ライブラリ | PHP 5.4(mysql) | PHP 5.4(mysqlnd) | PHP 5.5 | PHP 5.6 | PHP 7.0 | PHP 7.1 | PHP 7.2 |
---|---|---|---|---|---|---|---|
mysql | 5.2123 | 4.9343 | 5.4370 | 5.2269 | – | – | – |
mysqli | 4.9907 | 4.8713 | 4.6398 | 4.6325 | 4.7100 | 4.6558 | 4.6536 |
pear-mysql | 5.2667 | 5.1264 | 5.6582 | 5.7178 | – | – | – |
pear-mysqli | 5.1056 | 4.8985 | 4.9630 | 4.7075 | 4.5755 | 5.1262 | 5.0849 |
PDO | 4.8546 | 4.3504 | 4.6251 | 4.8116 | 4.3769 | 4.6077 | 4.5461 |
まとめ
- ほぼ予想通り、PEAR::MDB2 > mysql > mysqli > PDO の結果となりました
- mysql と mysqlnd に関しても mysql > mysqlnd の結果となり、こちらもほぼ予想通りの結果です
- スクリプトの書き方が悪いのか警告を無視して実行した影響か、高速になったという PHP7 の威力はそれほど感じられない結果となってしまいました