DBのコネクションを張るコストについてちょっとだけ考察してみた

DBのコネクションを張るコストについてちょっとだけ考察してみた。

お題はMDB2でコネクションを新規に張るのと、コネクションを張りっぱなしでクエリを投げるのでどれぐらいコストが高くなるのか。

たぶんmysql側でコネクションプーリング?があるような気が。アプリ側(php側)からみたらプーリングされてないけど、たしかサーバ側でコネクションを張るコストを抑える努力をしてたような、してなかったような。

回数は10,000回。クエリは単純なやつで。


for($i = 0; $i< MAX_ATTEMPT; ++$i){
if(!($i%10)){echo $i.' ';}
$mdb2 = MDB2::connect($dsn);
$mdb2->query('select * from test limi 1;');
$mdb2->disconnect();
}
//sleep(1);
echo "\n total ".(getMtime()-$start)."\n";

これで結果が

total 113.676899195


for($i = 0; $i< MAX_ATTEMPT; ++$i){
if(!($i%10)){echo $i.' ';}
$mdb2 = MDB2::singleton($dsn);
$mdb2->query('select * from test limi 1;');
//$mdb2->disconnect();
}
//sleep(1);
echo "\n total ".(getMtime()-$start)."\n";

こっちは

total 6.34343004227

めっちゃはえええ!

10000回あたりでコネクションを張るコストが100秒ということで、一回のコネクションあたり10msぐらいかかるのかな?結構早いなぁ・・・。

ついでにPDOでも試してみた。


$start = getMtime();
for($i = 0; $i< MAX_ATTEMPT; ++$i){
if(!($i%10)){echo $i.' ';}
try{
$pdo = new PDO("mysql:host=db.l2tp.org; dbname=test",'yousan',""\
);
}catch(PDOException $e){
var_dump($e->getMessage());
}
$stmt=$pdo->query('select * from test limit 1;');
$pdo = null;
}
echo "\n total ".(getMtime()-$start)."\n";

total 90.24330616

MDB2にくらべて75%ぐらいの時間しかかかってない。


$start = getMtime();
try{
$pdo = new PDO("mysql:host=db.l2tp.org; dbname=test",'yousan',"");
}catch(PDOException $e){
var_dump($e->getMessage());
}
for($i = 0; $i< MAX_ATTEMPT; ++$i){
if(!($i%10)){echo $i.' ';}
$stmt=$pdo->query('select * from test limit 1;');
}
echo "\n total ".(getMtime()-$start)."\n";

total 3.78206896782

こちらも早い。クエリの発行が早いっぽいっすね。60%ぐらいになってる。

ちなみに現在、60クエリ/秒ぐらい吐かれているので、うーん、PDOに変えるメリットは・・・、よくわかんないです。

コメントを残す