2008年05月

 

mysql_connect ⇒ 接続があるごとにコネクションを確立。スクリプトが終われば自動的にコネクションをクローズする。 

mysql_pconnect ⇒ 同じホスト、ユーザ、パスワードのコネクションであれば前回のコネクションを使いまわす。 

 

ということでコネクションを再確立しない分mysql_pconnect()の方が早いとは思うが気になるのでApacheBenchを使って両者の処理時間を測定してみました。 

使用したスクリプト(PHP)のソースはこんな感じ。 

mysql_connect.php 



[php]

$db_connection = mysql_connect("localhost","username","userpass");

mysql_select_db("dbname",$db_connection);

$result = mysql_query("SELECT * FROM users");

if($result) {

echo "DB is connect";

} else {

echo mysql_error();

}

[/php] 

 

mysql_pconnect()を使用したスクリプト:mysql_pconnect.php



[php]

$db_connection = mysql_pconnect("localhost","username","userpass");

mysql_select_db("dbname",$db_connection);

$result = mysql_query("SELECT * FROM users");

if($result) {

echo "DB is connect";

} else {

echo mysql_error();

}

[/php] 

 

計測する前にApacheBenchについて少しだけメモ。 



ApacheBench(abコマンド)は、Apacheに標準で付属しているベンチマークソフトです。リクエスト数や同時接続数を実行時のオプションとして指定できるため、用途に応じた負荷を再現することができます。 

http://www.atmarkit.co.jp/flinux/rensai/apache2_02/apache02b.html
 

こんな便利なコマンドがApacheにあるなんて知らなかったなぁ。 

-nで指定するリクエスト数に10000、同時リクエスト数を表す-cには10を指定して実行してみた。



[bash]

$ ab -n 10000 -c 10 http://localhostmysql_connect.php

Concurrency Level: 10

Time taken for tests: 23.739220 seconds

Complete requests: 10000

Failed requests: 0

Write errors: 0

Total transferred: 1890000 bytes

HTML transferred: 130000 bytes

Requests per second: 421.24 [#/sec] (mean)

Time per request: 23.739 [ms] (mean)

Time per request: 2.374 [ms] (mean, across all concurrent requests)

Transfer rate: 77.72 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.0 0 0

Processing: 8 23 0.4 23 30

Waiting: 8 23 0.4 23 30

Total: 8 23 0.4 23 30

$ ab -n 10000 -c 10 http://localhostmysql_pconnect.php

Concurrency Level: 10

Time taken for tests: 18.354149 seconds

Complete requests: 10000

Failed requests: 0

Write errors: 0

Total transferred: 1890000 bytes

HTML transferred: 130000 bytes

Requests per second: 544.84 [#/sec] (mean)

Time per request: 18.354 [ms] (mean)

Time per request: 1.835 [ms] (mean, across all concurrent requests)

Transfer rate: 100.52 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 7 4.8 8 16

Processing: 2 10 4.7 11 19

Waiting: 0 7 4.9 8 16

Total: 13 18 0.3 18 19

[/bash] 

 

Time taken for testsという項目があるが、mysql_pconnect()を使用した方が約5秒速い。リクエスト数を100、1000と変えてみたが、やはりmysql_pconnect()の方が速かった。リクエスト数100000の時では1分の差が出た。 

 

まぁ、ソース見ればわかるけど、データベースにコネクションを確立してクエリを実行するだけの簡単なソースなので、いつでもどこでもmysql_pconnect()を使えばよいといいというわけではないのでご注意を。



このエントリーをはてなブックマークに追加



 

PHPからDB接続する際に意識せずmysql_connectを使っていたが、微妙に似ているmysqli_connectという関数もあることに気がついた*1。 

 

mysqli_**2となっているものは『MySQL 改良版拡張サポート』と呼ばれているもので、MySQL4.1.2以降で使用できるらしい。 

 

さて、mysql_connectとmysqli_connectの違いだが、以下の例のような手続き型で使用する限りは違いはないようだ。 

 

(下記はmysqliの例だが、mysqlの場合もmysqli⇒mysqlにするだけで同様の結果を得られる。)



[php]

$mysql_con = mysqli_connect("localhost","username","password","db_name");

$result = mysqli_query()$mysql_con,"SELECT column1, column2 FROM TABLE");

while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) {

echo $row['column1'] . $row['column2'];

}

mysqli_close($mysql_con);

[/php]

 

しかし、これに加えてmysqliではオブジェクトAPIというのが利用できる。mysql(関数API)では戻り値は数値、文字列だったが、mysqliではオブジェクトが戻り値となる。上記コードをオブジェクトAPIを使って書くと以下のようになる。



[php]

$connection_obj = new mysqli( "localhost", "user", "password", "db_name" );

$result = $connection_obj->query( "SELECT column1, column2 FROM TABLE" );

while( $Array = $Result->fetch_assoc ( ) ) {

echo $Array;

[/php]

 

先にも言ったが、オブジェクトAPIを使わない限りどっちを使っても結果は変わらない。ただ、mysql_connect()はコネクションを再利用するのに対し、mysqli_connect()は常に新規にコネクションを取得する。 

 

また、これに関連してmysql_pconnect()という関数があり、この関数はコネクションを保持し続けるが(持続的接続)*3、mysql_close()関数を使ってもクローズすることはできない。持続的接続を有効にするにはphp.iniのmysql.allow_persistentをONに変更する必要がある。
 





*1:他にもmysql_queryとmysqli_query等がある

 

*2:*にはconnectやqueryが入る

 

*3:持続的接続について詳しくは持続的データベース接続を参照。

 

このエントリーをはてなブックマークに追加


最近技術関係の本を洋書で読んでいる。


JavaScript、PHP、Ajax、MySQL等、Amazonで色々買って読んでいるけど、日本の書籍を読んでるのとは何かが違う。読むスピードは(英語を読んでいるにしては)速いし、理解力も上がってる気がする。なにも「おれは英語ができるぜー」とか自慢したいわけじゃない。そもそもセンター試験の英語で半分も取れなかった俺が英語が得意なわけがない。


色々考えてみたけど原因はいくつかあるみたいだ。



原因1:英語で読むことでモチベーションがあがる



最初に言っておくがこれは英語の勉強をしている人、もしくは英語に興味がある人にしか当てはまらない。「洋書を電車の中で読んでたらかっこいいぜぇ~」っていう人にも当てはまる(自分がそう)。一つのことをやるだけで、英語の勉強と技術の習得ができてしまうので、こんなおいしいことはないと脳が認識し、学習効率を高めているんじゃないかと勝手に思っている。


ただ、気をつけなくちゃいけないのは自分の英語力以上の本を選択してしまうとモチベーションが逆に下がってしまうので注意。最近はAmazonでも(数ページだけだが)中身を見ることのできる本が増えてきたし、Google ブックスというすばらしいものまである(本によってはほぼ全ページ見れるものもある)。こういうサイトを使って事前に英語レベルと技術レベルが自分に合っているかどうかを判断してから購入しないとお金の無駄になってしまう*1。だが、入門的な本(本名に「novice」とか「beginner」とあるもの)は大抵平易な文法や単語で書かれているのでそこまで心配する必要は無い。



原因2:日本の書籍がそもそもクソい



大して技術も無い自分がこんなこと言ってはおこがましいが、日本人が書いた技術書は、明らかに説明がザルで「ここは難しいから他の本読んでね」とか「ここは気にしてもしょうがないから飛ばします」みたいな記述が多い。著者の力量不足なのか、本当に気にしてもしょうがないのかは俺には判断がつかないけど、洋書だとそういう些細なところもちゃんとページを割いて説明している(だから洋書はあんなに厚いのか?)。そしてそういう細かい知識が後々理解を深めるといったことが少なくない。


じゃあ翻訳されたものを読めばいいじゃないかと言われそうだが、翻訳されたものは原著とはまったく違う書籍だと思ったほうが良い。英語⇒日本語というプロセスを辿る事で、細かいニュアンスが消えてしまったり、酷いものになるとページを割愛してしまっている物さえある。原著に近い内容になるかかけ離れた内容になるかは翻訳者の力量にもよるしね。






というわけで、技術書は英語で読もうという話でした。やっぱりアメリカってITの技術的な事に関しては日本よりもかなり先をいっているんで、その国にいる第一線の人が書いた本は(例外はあるだろうが)やはり一級なわけだとおもうんです。だったら怪しさ満点の日本の本読むより、洋書読んで力つけた方がいいに決まってるわな。




*1:AmazonやGoogleブックスにに無かったとしても、本名をコピペして検索かければ、出版社のホームページが引っかかり、その中で試読できる場合も多い。残念ながらできないものもある。



このエントリーをはてなブックマークに追加


CHAR型とVARCHAR型について


ストレージエンジンがInnoDBでないのであれば、CHAR型の方がVARCHAR型よりもテーブルへのアクセスは早い様子。



このエントリーをはてなブックマークに追加


MySQLでよく使用されるMyISAMとInnoDBについての比較。






 ディスクスペース処理速度トランザクションメモリ消費推奨クエリ
MyISAM無しSELECT,INSERT
InnoDB有りUPDATE

一般的に、SELECTやINSERTを頻繁に使用する場合(トランザクションを使用しない場合)はMyISAM、UPDATEを頻繁に利用する場合(トランザクションを使用する場合)はInnoDBを使用するのが良い。



このエントリーをはてなブックマークに追加

↑このページのトップヘ