phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編 その2
前回の記事の検証では、いまいちコネクションプーリング自体を理解していない状態での検証でした。
その為、良い結果を出す事が出来ませんでしたので再度挑戦しました。
前回の記事
http://d.hatena.ne.jp/camelmasa/20090225/1235515758
コネクションプーリングの利点が引き出せなかった原因
- ディスク上に書き込みが発生してしまうINSERTクエリを発行していた。
- execでphpを実行した為
id:sh2さんコメント有難う御座います。
また、mixiにてさぁやさんからもご指摘を頂きました。
MySQLコミュニティ
http://mixi.jp/view_bbs.pl?id=40155421&comment_count=2&comm_id=2234
コメントもあったようですが,exec で php プロセスを毎回立ち上げては,pconnect を使ってないのと一緒ですよね
単純に,
for(;;) {
$dbh = mysql_pconnect(...);
}という場合と,
for(;;) {
$dbh = mysql_connect();
mysql_close($dbh);
}のコードで比べてみてはいかがでしょうか?
なるほど。
僕は『スクリプトの実行が終了してもMySQLとの接続が閉じられないということ』という事でexec関数で1万回phpスクリプトを実行してしまいました。そういう意味では無いという事ですね。
さぁやさん有難う御座いました。
さぁやさんのmixi
http://mixi.jp/show_friend.pl?id=379328
前回の反省を踏まえ、スクリプトのSQL部分を、書き込みが発生しないSELECTクエリに変更し、さぁやさんが提供して頂いたソースで検証してみたいと思います。
また、for文内でMySQLに毎回接続しない方法でも検証してみたいと思います。
mysql_connect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続)
<?php $start = array_sum(explode(" ",microtime())); for($i=0;$i<1000000;$i++){ $link = mysql_connect('localhost', 'root', '[パスワード]'); mysql_select_db('mysql_connect', $link); $result = mysql_query("SELECT 1;"); mysql_close($link); } $end = array_sum(explode(" ",microtime())); echo "\n".$end - $start; ?>
実行結果
- 137.99708008766
- 127.38695812225
- 141.63528704643
- 133.98114085197
- 142.13206601143
平均130秒程度といった結果でした。
mysql_pconnect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続)
<?php $start = array_sum(explode(" ",microtime())); for($i=0;$i<1000000;$i++){ $link = mysql_pconnect('localhost', 'root', '[パスワード]'); mysql_select_db('mysql_connect', $link); $result = mysql_query("SELECT 1;"); //mysql_close($link); } $end = array_sum(explode(" ",microtime())); echo "\n".$end - $start; ?>
実行結果
- 78.858249902725
- 62.917754888535
- 59.676470994949
- 76.271098852158
- 65.784828901291
平均70秒程度といった結果でした。
mysql_connect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)
<?php $start = array_sum(explode(" ",microtime())); $link = mysql_connect('localhost', 'root', '[パスワード]'); mysql_select_db('mysql_connect', $link); for($i=0;$i<1000000;$i++){ $result = mysql_query("SELECT 1;"); } mysql_close($link); $end = array_sum(explode(" ",microtime())); echo "\n".$end - $start; ?>
実行結果
- 26.621978998184
- 27.744408845901
- 27.353181123734
- 22.033998966217
- 21.772191047668
平均24秒程度といった結果でした。
mysql_pconnect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)
<?php $start = array_sum(explode(" ",microtime())); $link = mysql_pconnect('localhost', 'root', '[パスワード]'); mysql_select_db('mysql_connect', $link); for($i=0;$i<1000000;$i++){ $result = mysql_query("SELECT 1;"); } //mysql_close($link); $end = array_sum(explode(" ",microtime())); echo "\n".$end - $start; ?>
実行結果
- 21.91073012352
- 28.815995931625
- 21.802286863327
- 26.527863025665
- 24.077289104462
こちらも平均24秒程度といった結果でした。
まとめ
for文内等でMySQLに毎回接続しなくてはいけないケース(どうゆうケースか想定出来ませんが…)php + MySQLでのコネクションプーリングの利点を確認する事が出来ました。
しかし、for文内でMySQLの接続をする必要が無ければ、コネクションプーリングする必要性が無いという結果が出ました。
次こそはphp + Oracle Database XEのコネクションプーリングを検証したいと思います!
[追記]
次回もid:sh2さんやmixiでのさぁやさんからご指摘を頂きab (Apache Bench)によるコネクションプーリングの検証を行いたいと思います。
ご指摘有難うございます。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/