スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MySQL FetchSize

アプリケーションでDBを検索して、その件数が多い場合に、ページに表示する件数を制限して、「前へ」「次へ」とやってページを分けるのはよくある。簡単なようで結構ややこしい。

それをどう実現するかだが、方法としては、
1. 全件取得
 DBから全件持ってきて、それをセッションに保持しておいて、ユーザがリクエストしたタイミングで、たとえば30件ずつ表示していく。この場合、1回のDBアクセスで、前後ページに移動する分のデータはすでにあるので、何度もDBにアクセスしなくて済むというメリットがあり、また簡単にできる。
 しかし、これだと、一行のサイズや件数が多いとかなりメモリを消費する。またユーザごとに検索条件が違う場合、かつユーザが同時にアクセスすればさらに消費する。これは確実にOutOfMemoryになる。

2. キー全件取得
 次にキーのみを全件持ってくる方法だ。そしてたとえば次へを押したら、次の30件分のキーをつけてDBを検索する。これは1に比べるとキーだけの分メモリの消費は少なくて済し、またコーディングも楽である。ただし、莫大な件数があるとこれまた問題である。
 この場合、DB上にワークテーブルを作ってキーを格納してしまうという方法で問題を解決できる。

3. TOPn分析(Oracle)
Oracleであればrownumを使って、DBから取得する件数を制限できる。これだとメモリ消費の問題はない。しかし、境界線の問題がややこしいし、途中で追加、削除があると、前に戻ったとき、件数を合わせるのが大変だったりする。

4. JDBCの標準機能
ResultSet#absolute()などのメソッドを使う。

5. JDBCドライバ固有の機能を使う

実際、Oracleを使うことが多かったので、3でほとんどやっていたが、4のやり方はやったことがなかった。ここのサイトでDbUtilを使ったやり方が書いてあった。

MySQLを使ってやろうと思ったが、まず、ResultSetの取得で、カーソルを回して、順次持ってきているかどうか確認したかったので、以下のようなソースで確認してみた。

stmt.setFetchSize(1);
でフェッチサイズをセットして、

while (rs.next()) {
 System.out.print("OK");
 br.readLine();
System.out.print(rs.getString(1)) ;
}

一個一個確認しながら先に進めていく。アプリケーションからだけではわからないので、DBとアプリを別々のマシンにして、etherealでネットワーク通信のところをキャプチャーして、1回1回通信を行っているか確認する。
MySQLの場合、全くFetch Sizeが機能していない。1だと少なすぎたかと思い、増やしてみたがだめ。1万件のテストデータを作ったが、一度に全件持ってきてしまう。
Oracleで試してみると、きちんと指定した数ずつデータを持ってきている。

MySQL Forumを見てみると、

There is the beginnings of this support in MySQL-5.0,

だなんて書かれている。この手はMySQL 4系では無理か。
では、rownumはどうか。どうやら方法はある。

set @rownum := 0;
select @rownum := @rownum + 1, foo from bar where @rownum < 30;
という風にすればよさそうだ。
MySQLだとOracle同様、from句にselect文を書けるので
select * from
(select @rownum := @rownum + 1 as rank, foo from bar)
where rank between 30 and 60;
とすると任意の間隔で取れそうだ。
(ただOracleでもそうだが、単純にrownumを使うと、間に追加、削除があると厄介なことになる。)


関連記事
スポンサーサイト

コメント

非公開コメント

MySQLでこういうことをする場合は普通limit節を使うと思うのですが。(的外れだったらすいません。)

http://dev.mysql.com/doc/mysql/ja/select.html

アドバイスありがとうございます。確認してみたいと思います。

それにしても私はDB研に参加していながらMySQLのことはほとんどわかっていないんですよね。これを機に詳しくなろうかな。
プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。