• 締切済み

飛び飛びデータ検索

MYSQLにて、データ検索を行っております。 A番目のレコードからB個飛ばしで360個のデータを抽出したいのですが、 なかなか速くて良い方法が見つかりません。 例えば、5番目,8番目,11番目・・・と言う風に 最初とインターバルが決まっています。 今、試してみたものが、FOR文で"何番目のレコード"という値を360個取得し、 INを使って検索しています。 しかし、この方法だと、平均1SEC,最悪インターバルの代わった後だと3SEC 掛かってしまいます。 目標は、0.1SEC。とにかく速ければ速いほど良いと言うことなのですが・・・ 何か良い方法・ヒントなどありましたら、ご教授下さい。 宜しくお願いいたします。

  • atty
  • お礼率50% (1/2)

みんなの回答

  • aton
  • ベストアンサー率47% (160/334)
回答No.2

 MySQLには詳しくないので以下DBMS一般の話になりますが,たぶん,無理です。  ハードディスクのシークは,民生用だと現在最も高速なものでもサブ10ミリ秒がやっとだと思います。仮にシーク速度を10ミリ秒とすると,360個のデータにアクセスするにはシークだけで0.36秒かかります。読み出しその他の処理を加えて1~3秒というのは妥当な値だと思います。  これ以上の高速化を目指すなら,考えられるのは, ・ディスクアクセスを減らす  →キャッシュサイズを大きくとる ・シークを減らす  →データを(インターバル間隔で)連続配置する  →データ番号をインターバルで割った余りを格納するカラムを追加し,そこにインデックスを張る (この方法が有効に機能するのは,インターバルが変化しないときのみ。インターバルを複数用いる場合も,ある程度の高速化は期待できるでしょうが,シークは削減できないので効果は限定的になるでしょう。またカラムが増えるのでストレージコストは増加しますし,更新コストも大きくなります) くらいでしょう。  あるいは(この処理の目的がわからないので適当な答ではないかもしれませんが)データの更新があまり頻繁でなく,参照速度が重要なのであれば,私なら,予め答を計算したものを格納しておいて,それにアクセスするという方式を取ります。更新があった場合は再計算が必要なので更新コストは極めて高くなりますが,参照速度は速くなります。

  • snoopy64
  • ベストアンサー率42% (337/793)
回答No.1

初期値=f、間隔=i、個数=c、レコード番号=r とおくと、 mod(r-f,i)=0・・・(レコード番号-初期値)が間隔で割り切れる かつ (r-f)/i<c ・・・(レコード番号-初期値)/間隔が個数未満 かつ r≧f ・・・レコード番号≧初期値 という条件でどうでしょう。 SQLはよく知らないので、レコード番号なんてものが使えるのかはわかりませんが。

atty
質問者

お礼

早速のご回答有り難うございます。 似たような形のものを試してみましたが、 レコード1つ1つに対して計算を行うようで、 少し時間が掛かってしまいます。 全レコード数は2万件です。 実際は20万件程度になると考えております。 計算をせずにまとめて一気に取れる方法など ありませんでしょうか?

関連するQ&A

  • phpMyAdminでのデータ検索方法

    「さくら」のレンタルSVを利用しています。 そのSVのphpMyAdminで特定のレコードの検索方法について教えてください phpMyAdminのバージョンは3.3.10.5となっています テーブルはフールド数200程度、レコード数2000程度のDBがあります その中から、ある特定のレコードを抽出して特定のフィールドのデータ 修正をしようとしています phpMyadminにログインし該当のテーブルを指定してデータを全件表示します。 例えばフィールドが、a1,a2,a3,a4・・・とあったとします a1に"abcde"があることを確認した後(試験のためで本来は必要なし)、 phpMyadminの検索メニューをクリックして検索画面に進みます その画面でフールドa1のところに"abcde"を打鍵して「実行」ボタン を押下したら、本来は該当のデータが出てくると思うのですがエラー画面がでます 内容は 実行したSQL: select'a1','a2','a3'・・・・ from 'テーブル名' where 'a1'=abcde order by limit 0,30 MySQLのメッセージ #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 30' at line 2 とこのようなメッセージがでます ちなみに 次のSQLのselectの所を全て選択するのでなく*で記載すると該当のレコード を抽出できます select * from 'テーブル名' where 'a1'=abcde phpMyAdminの検索画面の最下段にオプションがあり該当のフィールドを 1つ以上選択できる画面があるのですが、10件程度の選択なら抽出します 全件を選択したり20件だとエラーとなります このオプションでの選択数は限度があるのでしょうか あるいは、別に何か選択する方法があるのでしょうか どなたか、上記の操作で検索ができるようにする方法を教えて いただけませんか よろしくお願いします。

  • Accessで重複したデータのみ平均を割り出す方法

    WindowsXP、Access2003を使っています。 00:00:00 1 00:00:00 2 00:00:01 3 00:00:02 1 00:00:03 1 00:00:03 1 このように時間と数字が隣り合ったデータがあるのですが、 時間が同じところは数字を足して平均を割り出す方法はありませんか? 上記のデータだと 00:00:00 1,5 00:00:01 3 00:00:02 1 00:00:03 1 このようになるようにしたいです。 まず時間が重なるレコードを抽出出来ればいいと思うのですが、 重複データを削除するやり方はわかっても、抽出の方法がわかりません・・・

  • MySQLでデータを時間範囲で抽出したい

    mysqlでテーブルから、日付データが1ヶ月以内でかつ7時から8時までのデータを抽出する方法がわかりません。 テーブル内のtimeカラムにはタイムスタンプ型で日付が入っています。 time「2012-06-04 07:14:38」 time「2012-05-04 10:14:38」 time「2012-05-04 08:14:38」 time「2012-05-04 13:14:38」 SELECT * FROM table WHERE time >= DATE_ADD(NOW(),INTERVAL -1 MONTH) で1ヶ月以内のデータは抽出できたのですが、さらに7時から8時までのデータを抽出する方法が分からずかなり困っています。 どなたかご教授お願いいたします。

  • 検索項目のデータの比較確認方法が分かりません。

    データベースの主キーの時刻と同じ時刻のデータを 持っていた場合には、UPDATEで修正する。主キーと 同じ時刻とは異なったデータを持っている場合には、 INSERTでDBに書き込みをしたいのですが、うまく動 作させることができない状況です。 $DSQ[0][0] = "2007-01-31 11:00:00"; $DSQ[0][1] = 2.5; $DSQ[0][2] = 3.7; $DSQ[0][3] = -0.8; $DDSQ[0][0] = "INSERT INTO data VALUES('".$DSQ[0][0]. "',".$DSQ[0][0]. ",".$DSQ[0][1]. ",".$DSQ[0][2]. ")"; $DDSQ[1][0] = "UPDATE data SET record_time = ".$DSQ[0][0].", data01 = ,".$DSQ[0][0].", data02 = ,".$DSQ[0][1].", data03 = ,".$DSQ[0][2]. ")"; $MySQL['conn'] = @mysql_connect($MySQL['HOST'],$MySQL['USER'],$MySQL['PASSWORD']) or exit('MySQLへ接続できませんでした'); mysql_select_db($MySQL['DATABASE'], $MySQL['conn']); $MySQL['query'] = "SELECT * FROM data WHERE record_time = '$DSQ[0][0]'"; $MySQL['result'] = mysql_query( $MySQL['query'],$MySQL['conn'] ); while($tableD = mysql_fetch_array($MySQL['result'],MYSQL_NUM)) { print_r("data_view = ".$tableD); print("\n"); } if( $DSQ[0][0] != $tableD[0]){ $MySQL['result2'] = mysql_query( $DDSQ[0][0],$MySQL['conn'] ) or exit($i.'番目のデータがMySQLへ書き込みできませんでした'); }else{ $MySQL['result2'] = mysql_query( $DDSQ[1][0],$MySQL['conn'] ) or exit($i.'番目のデータがMySQLへ書き込みできませんでした'); }

    • ベストアンサー
    • PHP
  • DBから抜き取ったデータを10レコードずつ表示する方法

    データベース(MySQL)にデータを置きPHPでデータを表示しています。 しかしデータが大量になってしまったので10レコードずつ表示したいと思っています。各レコードにはauto_incrementなどで番号などの目印はつけていません。 この場合、引数で?page=1とした場合、はじめのレコードから10番目のレコードを表示し、page=2となれば11番目から21番目のレコード....といった感じにするにはどうしたらよいのでしょうか?可能なのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLに格納するデータと検索速度

    MySQLに都道府県のデータをinsertしたいのですが、「北海道」という文字にするか、置き換えて数字の「1」にしようか迷っています。 「北海道」という文字をinsertした場合は、取り出したときにそのまま表示できるので便利かなと思っています。 しかしながら、抽出する際に「北海道」という2バイト文字で検索するのもどうなのかと思っています。 抽出する際には数字の「1」などの方が早いような気もするのですが、数万件のデータだったら「北海道」などの2バイト文字を検索しても問題ないでしょうか? このような場合の定石がありましたら教えてください。

    • ベストアンサー
    • MySQL
  • エクセルの検索で元データを増やしたい!

    Vlookupで元データを抽出できるようにしているのですが、 元のデータを増やすと範囲から外れてしまって、 検索の対象になりません。 データが増えても、 検索範囲になる方法はありますか? お願いします。

  • Excelですが、同一データが複数あるとき、検索して、その全部を抽出する方法

    Excelですが、検索キーに、同一データ(レコード)が複数あるとき、検索して、その全部を抽出表示する方法を教えてください。 Vlookupは、同一データが複数あるとき、最初の行(レコード)を1つだけ抽出してきます。2つ目、3つ目の行は抽出できませんが、その全部を抽出する方法がありますでしょうか。 例えば、以下の例で、「A株式会社」をキーに検索した場合、<検索結果>シートのように、該当のレコード3つ(行2~4)を抽出して表示するようにしたいのですが、方法はありますでしょうか。よろしくお願いします。 <データシート>  列A   列B     列C  列C 行1  No  会社名    所属  担当者 行2  1  A株式会社  ○事業部  坂下順人 行3  2  A株式会社  △事業部  滿山友人 行4  3  A株式会社  △事業部  目標達子 行5  4  B株式会社  設計部 山下清人 行6  5  B株式会社  営業部 横浜美人 行7  6  C株式会社  営業部 川崎次郎 行8 ・・ ・・・・・・・・・・ <検索結果:別のシートにおいて> 行1   会社名  所属   担当者 行2   A株式会社  ○事業部 坂下順人 行3   A株式会社  △事業部 滿山友人 行4   A株式会社  △事業部 目標達子

  • もっとも新しいレコードから検索する方法

    MySQLにデータを登録しており、PHPにてWebサイトにデータを表示しています。SQLはSELECT * FROM TABLE WHERE .... なんですが、この場合一番初めのレコードから順に表示されてしまうため、古いデータがはじめに、新しいデータが最後尾に表示されてしまいます。 これを解消するため最後尾のレコードから検索するにはどうしたらよいのでしょうか?又、カテゴリが異なってしまいますが、PHPでもっとよい方法などございましたらお願いします。

    • ベストアンサー
    • MySQL
  • データの検索の為に列を増やすのは正しいのか

    現在mySQLの勉強中です。 テーブルtableにidとnameとunixtimeが格納されています。 登録件数30000件。idは、登録申請時に順に割り振られています。 unixtimeはnameに対応する人間の登録確定時を表したものです。 したがって、idとunixtimeの順番は必ずしも一致しません このデータから、PHPを使って登録確定日別でid、nameのリストをhtmlで作成したいと思います。 たとえば20001224.htmlには2000年12月24日に登録確定した人のリストが入っているようにしたいです。 このような出力を効率的に行うために、unixtimeからyearとmonthとdateを作成しました。データ型はすべてintです。 あるデータのunixtimeが2011/12/31の場合、yearは2011、monthは12、dateは31となります。 htmlを作成するにあたり、データベースからデータを出力しなければいけません。そのため、 まずdateが条件に一致するデータを抽出して配列にidとmonthとyearを格納し、 次にmonthが条件に一致するものを抽出して配列にidとyearに格納し、 最後にyearが一致するデータのidを抽出し、idに該当するデータをechoしようと考えています。 が、この方法は正しいのでしょうか。 SQLは検索にいろいろテクニックが必要で、方法を誤ると途端に検索速度が速くなったり遅くなったりすると聞きました。 列を増やすことで、メモリの使用量が増えて検索が遅くなったり、もしかしたらunixtimeで上手に検索する方法があるのかもしれないと思います。 どなたかこういう時はどういう検索を行うのが正しいのか、ご教示ください。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL