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に毎回接続)

mysql_connect.php

<?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に毎回接続)

mysql_pconnect.php

<?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に毎回接続しない場合)

mysql_connect.php

<?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に毎回接続しない場合)

mysql_pconnect.php

<?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/