Web Artisan Blog - ウェブ アルチザン ブログ

PHP:SQLクエリのメモリ消費量を抑える:mysql_unbuffered_query

PHP

2006年12月26日

アフィリエイトから企業サイト分析まで。訪問者の動きがまるわかりのアクセス解析サービス「リサーチアルチザンプロ」

LINEやSkypeみたいなビデオ通話がブラウザだけでできる!オンライン通話サービス「EZ-Interview - イージーインタビュー」

PHPにてMySQLのSQL実行と言えば、mysql_query関数があります。
で、これを用いて組んでいくのはいいんですが、時として、mysql_query以外にクエリ実行できる方法は無いのかと考える時があるかも知れません。
(特に大量データを取得する場合、それによってサーバーに負荷が掛かるとか。。)

そんな時は、、というか、一応、以下の方法もあります。

mysql_unbuffered_query
MySQL に SQL クエリを送信するが、結果に対してのフェッチやバッファリングは行わない
・・・
mysql_unbuffered_query() は SQL クエリ query を MySQL に送信します。その際、 mysql_query() が行っているような自動バッファリングを 行いません。一方、この挙動により SQL クエリが消費するメモリの量を おさえられます。また、最初の 1 行目が取得されたらすぐに処理を はじめることができます。SQL の処理が完全に終わるまで待つ必要がありません。


mysql_unbuffered_queryでググっても、現状ほぼPHPドキュメントしか出てきませんが、内容としてはドキュメントに書いてる通り、SQLクエリのメモリ消費を抑えられるようです。
例えば10万件のデータを取得する場合、mysql_queryでは10万件の結果をバッファに溜めておいて一気にドカンと返すのが、mysql_unbuffered_queryでは1件毎に結果を返す、というような事でしょう。要は、バッファに溜めない分メモリ消費を抑えられると。

mysql_unbuffered_query() から返される結果セットには mysql_num_rows() や mysql_data_seek() が使用できません。また、結果の行をすべてフェッチするまで、MySQL に 新しいクエリを送信することができません。


上記の弊害もあったり、環境にもよるでしょうが、場合のよってはこちらを使用した方が良い場合があるでしょう。。


Web面接に最適。ブラウザだけでビデオ/音声通話ができるオンライン通話サービス。「EZ-Interview - イージーインタビュー」
訪問者録画機能も付いたシンプルで高機能なリアルタイムアクセス解析「リサーチアルチザンプロ」