MYSQLにて、データ検索を行っております。

A番目のレコードからB個飛ばしで360個のデータを抽出したいのですが、
なかなか速くて良い方法が見つかりません。

例えば、5番目,8番目,11番目・・・と言う風に
最初とインターバルが決まっています。

今、試してみたものが、FOR文で"何番目のレコード"という値を360個取得し、
INを使って検索しています。
しかし、この方法だと、平均1SEC,最悪インターバルの代わった後だと3SEC
掛かってしまいます。
目標は、0.1SEC。とにかく速ければ速いほど良いと言うことなのですが・・・

何か良い方法・ヒントなどありましたら、ご教授下さい。
宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 MySQLには詳しくないので以下DBMS一般の話になりますが,たぶん,無理です。



 ハードディスクのシークは,民生用だと現在最も高速なものでもサブ10ミリ秒がやっとだと思います。仮にシーク速度を10ミリ秒とすると,360個のデータにアクセスするにはシークだけで0.36秒かかります。読み出しその他の処理を加えて1~3秒というのは妥当な値だと思います。

 これ以上の高速化を目指すなら,考えられるのは,

・ディスクアクセスを減らす
 →キャッシュサイズを大きくとる

・シークを減らす
 →データを(インターバル間隔で)連続配置する
 →データ番号をインターバルで割った余りを格納するカラムを追加し,そこにインデックスを張る
(この方法が有効に機能するのは,インターバルが変化しないときのみ。インターバルを複数用いる場合も,ある程度の高速化は期待できるでしょうが,シークは削減できないので効果は限定的になるでしょう。またカラムが増えるのでストレージコストは増加しますし,更新コストも大きくなります)

くらいでしょう。

 あるいは(この処理の目的がわからないので適当な答ではないかもしれませんが)データの更新があまり頻繁でなく,参照速度が重要なのであれば,私なら,予め答を計算したものを格納しておいて,それにアクセスするという方式を取ります。更新があった場合は再計算が必要なので更新コストは極めて高くなりますが,参照速度は速くなります。
    • good
    • 0

初期値=f、間隔=i、個数=c、レコード番号=r とおくと、


mod(r-f,i)=0・・・(レコード番号-初期値)が間隔で割り切れる
かつ
(r-f)/i<c ・・・(レコード番号-初期値)/間隔が個数未満
かつ
r≧f ・・・レコード番号≧初期値
という条件でどうでしょう。

SQLはよく知らないので、レコード番号なんてものが使えるのかはわかりませんが。
    • good
    • 0
この回答へのお礼

早速のご回答有り難うございます。

似たような形のものを試してみましたが、
レコード1つ1つに対して計算を行うようで、
少し時間が掛かってしまいます。
全レコード数は2万件です。
実際は20万件程度になると考えております。

計算をせずにまとめて一気に取れる方法など
ありませんでしょうか?

お礼日時:2001/09/14 08:58

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QVSAM,QSAM,BSAM,BPAM,BDAM

データセット編成とアクセス法に関してですが、それぞれ、どのようなデータセットとして使われることが多いですか?データを入れるとか…、プログラムを入れるとか…。

Aベストアンサー

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAMはVSAMアクセスの動作方式のことで
す(プログラム中では意識する必要ありません)。

> BDAMはディスクか???
これもアクセス方式ですね。目的レコードの相対アドレ
スを指定してアクセス(READ/WRITE)する方式です。

> DBやJCL、ファイルを入れる場合はBPAMか?
DBは別物です。JCL、プログラム等が格納されるファイル
の形式(編成)がBPAMです。

> ボリュームという言葉があるけれど、データ編成で考えてはいけないのか?
ボリュームとは例えば磁気テープ1本、磁気ディスク1
スピンドルといった補助記録媒体の単位です。
→ 磁気ディスクには1ボリューム中に複数の異なる
  データ編成のファイルを作成可能です。

> ボリュームはどのようにできているのか?
VTOCおよびデータ領域です。

> ボリュームより大きいものはなんと言うのか?
通常ボリュームグループという概念があります。
→ この概念が無いとマルチボリュームファイルは作成
  できませんから・・・。

> 機能は、ちゃんと読んでみます。データ編成は他にもありそうな…。
NECの場合だと、相対編成、乱編成、待機結合編成なんて
のもありますね。

> ファイル編成とデータセット編成は同じことだよな…。???
大体において同じ意味で使用しているケースが多いです。

私の会社ではまだメインフレーム現役です・・・。

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAM...続きを読む

Q最終レコードだったら新規レコードへ

帳票式のフォームで、最後のフィールドまでに移動したときに、もしも最終レコードではなかったら、次のレコードに移動して、もしも最終レコードだったら新規レコードに行くという処理を行うにはどうすればいいですか?

Aベストアンサー

フォームのプロパティで、
「Tabキー移動」→「すべてのレコード」
この設定ではダメですか?

QAccessのフォーム上にレコード数とレコード番号の表示

Accessでクエリを元に表示するフォーム上で、テキストボックス等に関数を使って、レコード数とレコード番号を表示する方法がありましたら教えてください。

フォームの書式設定で「移動ボタン」の表示をすれば目的の事は出来るのですが、表示の大きさが調整できない為、とても見難いのです。

以上よろしくお願いします。

Aベストアンサー

レコード番号のコントロールソースを
=[CurrentRecord]
レコード数のコントロールソースを
=Count("*")-[NewRecord]
としてみてください。

Q関連レコードへの移動と関連レコードの新規作成

甲というデータベースの山田太郎さんのレコードを表示している画面から、乙というデータベースの同じ山田太郎さんのレコードにボタン一つで飛ぶように、スクリプトを「関連レコードへ移動」のコマンドで作りました。これは問題なくできました。

甲の山田太郎さんの画面から、乙に山田太郎さんのレコードがあればそこに移動して、もし乙に、山田太郎さんのデータが存在しない場合に、乙に山田太郎さんの新規レコードを作るようにするには、どのようなスクリプトを作れば良いでしょうか。

Aベストアンサー

FM4でしたら

乙のファイルに次のスクリプトを作ります。
・新規レコード
・ペースト(選択/氏名のフィールド)

甲のファイルにも次のスクリプトを作ります。
・コピー(選択/氏名のフィールド)
・If[not IsValid(リレーション:氏名フィールド)]
 ・スクリプト実行(外部、上の乙のスクリプト)
・End If
・関連レコードに移動(関連レコードのみ、リレーション)

甲のファイルの任意のレコードでこのスクリプトを実行します。

Qファイルメーカー6で複数のレコードを1レコードにするには

MacOS9.2 ファイルメーカー6を使ってます。
全くの初心者です。よろしくお願いします。
今、簡単な納品書をFMで作ってます。
1行で品名と単価と個数と合計を表し
5行分あります。それに総合計が1つあります。
フィールドは1行目を品名1・単価1・個数1・合計1とし
2行目以降もそれぞれ2として、全部で5行分×4フィールドの
20フィールドと総合計フィールドを定義してます。
この納品書自体は問題ないのですが、
この内容を1枚にまとめ請求書として利用したいんです。
ただ、請求書は決まりがあり、行数が30行の表にして、
1行で品名1と総合計を表し、納品が有っただけの行数で表示したいんです。
例えば、10回(10日)納品が有った場合、1行目に納品書の1レコードの
品名1と総合計、2行目以降も同じ2レコード、3レコード・・・と表し、
11行目以降は表の罫線だけとしたいんです。
表自体は線で作れば出来るんですが、納品書から取り込む方法が分かりません。
もちろん、一つのファイルで納品書用レイアウトと請求書用レイアウトを作る方法でもいいですが、その場合だと請求書も納品書と同じ数のレコード数になりますよね。請求書用のレコードを小さくして、表として表示したら、1枚で印刷出来そうなんですが、その場合は30行に出来なさそうで困ってます。
質問が分かりづらくすみませんがよろしくお願いします。
何かいい方法を教えてください。

MacOS9.2 ファイルメーカー6を使ってます。
全くの初心者です。よろしくお願いします。
今、簡単な納品書をFMで作ってます。
1行で品名と単価と個数と合計を表し
5行分あります。それに総合計が1つあります。
フィールドは1行目を品名1・単価1・個数1・合計1とし
2行目以降もそれぞれ2として、全部で5行分×4フィールドの
20フィールドと総合計フィールドを定義してます。
この納品書自体は問題ないのですが、
この内容を1枚にまとめ請求書として利用したいんです。
ただ、請求書は決まりがあり、行数が3...続きを読む

Aベストアンサー

納品書のフィールド構成がそのようなタイプだと、あとあと困ることも有りそうです。
(同じ系列のデータが違うフィールドに入っているという状態)
まあ、これはあとでどうにかなりそうですから置いといて、、、ポータルを使った方がいいです。

1.納品書ファイルで納品日フィールドを利用してYear関数とMonth関数を利用して納品日の年と月を
 取り出す計算フィールドを作り、仮に名前を「年」、「月」とする。結果は数字。
2.納品書ファイルで「連結」という計算フィールドを作る。式は
 =「相手先」& "-" & 「年」& "-" & 「月」で結果はテキスト。
3.請求書ファイルでは「年」と「月」という数字フィールドと、やはり2.と同じ「連結」という計算
 フィールドも作る。
4.請求書ファイルでリレーション定義を開き、相手ファイルを納品書ファイルとし、照合フィールド
 を両ファイルの「連結」フィールドとする。
5.請求書ファイルで新規レイアウトを作って、「相手先」、「年」、「月」、「連結」の各フィール
 ドを仮に配置し、さらにポータルツールを使って30行のポータルも配置。ポータルで指定するリレ
 ーションは4.で作ったリレーション名とする。ポータル内に置く関連フィールドはリレーション先
 の納品書ファイルの::品名1フィールドと::総合計フィールド。

こうすれば、請求書ファイルで相手先を入力し、「年」フィールドに2007、「月」フィールドに1を
入力すれば2007年1月度の全納品がポータルに表示される「はず」です。

納品書のフィールド構成がそのようなタイプだと、あとあと困ることも有りそうです。
(同じ系列のデータが違うフィールドに入っているという状態)
まあ、これはあとでどうにかなりそうですから置いといて、、、ポータルを使った方がいいです。

1.納品書ファイルで納品日フィールドを利用してYear関数とMonth関数を利用して納品日の年と月を
 取り出す計算フィールドを作り、仮に名前を「年」、「月」とする。結果は数字。
2.納品書ファイルで「連結」という計算フィールドを作る。式は
 =「相手先」& "...続きを読む


人気Q&Aランキング

おすすめ情報