Unable_to_save_result_set_in

MySQLでUnable to save result set in~というエラーが出る理由

 

技術というのは日進月歩。1ヶ月前書いたコードを見なおして赤面するのも自分のスキルが伸びていると思いたい今日この頃です。今回の問題は、「Unable to save result set in」というエラーについてです。

 

MySQLとPHPで出てきた「Unable to save result set in」の原因

「Unable to save result set in」の意味は、「リクエストして、返って来るレコード数が多すぎて、MySQLからPHPに受け渡す為のファイルに全件保存出来なかったぜっ」という意味です。参照しているデータが多すぎるということですね。

解決方法はいたってシンプル

多いなら数を制限してあげたらいい。SQLでlimitを使うことで取得するデータ数を制限できます。

/*データを先頭から100件取得する*/
SELECT * FROM tabledata LIMIT 100;
/*データを先頭(0行目)から150件取得する*/
SELECT * FROM tabledata LIMIT 0, 150;

上記のセレクト文で取得するデータを制限することでエラーを回避できます。ただ、この方法だと全件取得して何かしらの処理をしたい場合には使えません。

セレクト文の書き方でも回避できることもある

私の場合は、全件を取得する必要がありました。limtを使えないので、よく調べてみると、この「Unable to save result set in」というエラーは、かなりのレコード数にならないと出てこない。それこそ、10万や20万程度では出てこないらしい。もちろん、正しく無駄なくデータを取得している場合の話です。

私が必要としたデータは、50万行くらいのDBから同じ名前のデータが何件あるかを取得すること。この取得方法が問題だったらしく結果的に、とんでもない数(800万行くらい)のデータを変数に代入していたようでしたw

 

解決方法!欲しいのは同じ値の数

サンプルでコードを載せておきます。同じ名前の人をカウントして変数に配列として格納するMySQL+PHPのコードです。

「テーブル名は、table_name」

user_id column_name
1 田中
2 鈴木
3 山田
4 吉田
5 田中
6 山田
7 田中
8 鈴木
9 吉田
10 鈴木
$type_count = mysql_query("
select column_name, 
count(column_name) from table_name group by column_name
");

while($type_count_echo = mysql_fetch_row($type_count)){
$type_count_echos[]=$type_count_echo;
}

重要な要素は、必要なカラムのデータだけ取得していることです。全カラムのデータを取得してしまうとパンクしてしまいますし、動作も遅くなってしまいます。

これで、知りたいカラムの同値がどれだけあるかを配列に入れることが出来ます。2行で取得できるなんて・・・ものすごく不毛なコードを書いていた昔の自分が可哀想でなりません。

投稿日: 2012/04/25
最終更新日: 2017/10/28
 
筆者のご紹介
角政典@moreiic
真性のお家大好きフリーランスです。プログラムよりご飯の方が断然好き!博多出身のデブデザイナー。インドアだけど遊んでくれる人募集中!
よく検索されてる記事