おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

mysqlndってどうなんだろう

あんまり使ってみたという話を見たことがない。Rasmusのスライドに出てたくらいか。
mysqlndは、PHP5および6用のMySQLのネイティブドライバです。高負荷でのテストなどをしてくれるテスターを募集中のようです。

Now the mysqlnd is looking for the first brave testers. Willing to hammer the code with benchmarks and more importantly real world PHP application code. Particular need is for high load stress testing. Please pass all your feedback on to Georg and his team my mailing php@lists.mysql.com (see http://lists.mysql.com/ for how to subscribe).

mysqlnd is looking for testers - Poo-tee-weet

mysqlndは、mysqliで利用している "libmysqlを使っての接続" を置き換えるモノとなります。なので、Extensionではなく、PHPスクリプトのIF側は変わらずext/mysqliとなります。libmysqlを使わず、PHP専用に書かれており、それゆえに高速になったりいろいろな恩恵があるようです。コードは読めてないですが、内部でzend_hashなんか使っていて、特にデータの受け渡しの効率がよいんでないかと妄想。
データベースは趣味程度でしか触ることないので (しかし、DB触らないPHPerってどうなんだ俺) あまり興味ないのですが、むしろ、Extension書きとして興味津々です。

よくライブラリのwrapper Extensionを書いてて思うこと

ライブラリを使わずにネイティブドライバを書くことのメリットですが、Extension書いててありがちなのが、C/C++のライブラリから値を取得してきて、それをzval形式にするためにコピーしたりすること。特に配列やらSTLコンテナに入ってるものをイテレータ回してzend hashに複製しながら詰め直すなんてのは、せっかく前の人がきれいに箱に詰めたものを取り出して、また別の箱にキレイに詰めるワケですから、無駄きわまりない感じがします。これが、最初からネイティブドライバの方でzvalにつめてくれるなら、無駄な複製もせずにリファレンスカウンタインクリメントするだけでOKという感じになると。
もちろんそんなことしたら、PHPでしか使えなくなってしまうわけで、ポータビリティとのトレードオフとなるわけですが。あと、データの複製なんて無駄とはいえ、全体から見ると、そこまで時間はかからないので、速度向上の効果なんてほとんど見えなかったり。 もちろん、メモリは節約できるし、PHPに乗っかるとPHPのmemory limitの制限内でちゃんと動かせる。

ダウンロードとインストール

パッケージのダウンロード及びインストール解説はMySQL AB :: MySQL native driver for PHP - mysqlndから。
ext/mysqliのパッチ扱いということで、アーカイブをダウンロードしてきて、オリジナルのPHPソースコードのext/mysqliと置き換えて、buildする形です。

cvs -d :pserver:cvsread@cvs.php.net:/repository checkout php6

って、Installationでのcvsのチェックアウトの例が普通にPHP6を引っ張ってるところがすげー。

07/07/10 追記

ちょうどいい記事。

データ量が増加してきたときに、PHPのmemory_limit設定値でエラーが発生すると思うかもしれませんが、この制限値はMySQLライブラリが結果セットを取得する際に保持するメモリには適用されないのです。そのため、PHPの配列に保存する際にはエラーが発生しますが、クエリを発行してその結果をMySQLライブラリが取得するまではメモリが無尽蔵に消費されてしまいます。

サービス終了のお知らせ

これが、mysqlndであればmemory_limit制限値でエラーが発生するようになる。

と、くまさんに、Andrey HristovのプレゼンのPDFを教えてもらった

内部についての詳しい話や、libmysqlとのパフォーマンス比較も書かれてます