• 締切済み

インデックスを用いたbetween検索について

Cで1~360000までのランダムな整数の列(col1)を含む100万件のデータを作成し(50MB弱)、 create table table1(・・・, col1 integer not null, ・・・); で作ったテーブルにload data infile文で挿入し、 create index index1 on table1(col1); でインデックスを作成しました。 select * from table1 where col1 between 1000 and 2000; といったような検索(約2500件ヒット)をしたいのですが、この検索ではインデックスを作らないテーブルのほうが速く検索できてしまいます。 select * from table1 where col1 between 100 and 200; のような検索(約250ヒット)ではインデックスの効果があり、高速検索ができますが。 環境はMySQL-5.0.26、ノートPC(256MB)、Fedora Core5、設定ファイルはMy-large.cnfを、ほぼそのまま使用しています。 上記のような少し大きめの検索範囲でもインデックスを用いた検索を改善する方法をご教授お願いします。何かのパラメータが決定的に足りないと思うのですが。

みんなの回答

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

では、もう既に検索されてるかも知れませんが、チューニングパラメタが出ている参考URLを。 my.cnfファイルの下記パラメタを最適化しましょう。 >set-variable = key_buffer=256M #メモリに余裕がある場合に指定。検索に使われるインデックスをバッファに保存する際のメモリサイズ >set-variable = max_allowed_packet=1M #入力データ保持のための最大バッファサイズ。画像など、大きなデータ挿入でこの制限に引っ掛かる可能性がある

参考URL:
http://www.atmarkit.co.jp/flinux/rensai/mysql11/mysql11a.html
downboy
質問者

補足

key_befferは既に試しており、かなり余裕を持って作っても変わりませんでした。今回max_allowed_packetも変更しましたが、改善はみられませんでした。 更に、本来はもう一列同様に作り、複合インデックスで検索したいのですが、 select * from table1 where (col1 between 1000 and 2000) and (col2 between 1000 and 2000); こちらのほうは更に厳しく、10数件のヒットしかないにも関わらず、インデックスを使用しないときと同じくらい時間がかかってしまいます。 CPUの状況を見ると、インデックスを使わないときに比べて、全然働いていないようです。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

ヒット件数多い場合、取り出し結果をメモリ上に展開出来きらないと遅くなります。 っていうか、こういう場合カーソル等作って1件ずつ処理していくような気がしますけど。

downboy
質問者

補足

早速のご回答ありがとうございます。 最終的な目的からこのような検索方法になってしまうのです。 そのメモリを増やすパラメータはないのでしょうか。 実は他にもっと高性能のPCなどでチャレンジしていますが、どれも同じような結果になってしまうのです。 PostgreSQLで同様の検索を行なうと設定は変えないままでうまくいくのですが。

関連するQ&A