• ベストアンサー

DBエンジンの仕組みについて

はじめして。 例えば、認証システムを作ろうとします。 現在一万人の登録があるとして、田中さんが8千人目に登録されているとします。 そして、田中さんを検索するとき、 PerlとCSV形式のテキストファイル使用して検索する場合、上から順に8千行まで探して見つけますよね。 MySQLなどのDBサーバーを仕様する場合は、どういう形式で保存されているて、どういう形で検索するのでしょうか? DBエンジンを使うと何万件もの登録に耐えれ、かつレスポンスも早いとききます。なぜそうなのか、その根本的な仕組みをどなたか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.3

DBエンジンでも索引無しの場合は全データを上から順に検索していきます。 索引無し検索の場合、検索速度は大変遅くなります。 数千~数万件程度では索引無しでもそれほど大きな違いは出ませんが、数千万件のデータがあるような場合は必ず索引を付けなければ実用に耐えません。 DBエンジンによっては、OSが提供するファイルシステムを使用しないものもあります。 DBエンジンが独自にI/Oを行うことによってOSのオーバーヘッドを避け、より高速なI/Oを実現するためです。 これを使うと、ファイルシステム上のデータを検索するより遥かに高速にデータを取り出すことが出来ます。 またDBエンジンの設定にもよりますが、メモリ上に読みこむのは通常は索引だけです。 一旦読みこんだ実データ(レコード)はメモリ上にキャッシュされますが、使用されなけばキャッシュからは順次破棄されていきます。 でも出来るだけキャッシュをたくさん取れる様にしておいた方がパフォーマンスは良くなります。(当たり前ですね(^^;) >例えば、一万件のレコードをもつファイルが一つあるとします。 > そして欲しいレコードが五千件目とわかっているとします。 DBエンジンにも依りますが、一般的なDBエンジンなら5000件目という概念はほとんど意味がありません。 索引が無ければ全件を検索しにいきますし、索引があれば検索条件にヒットしたレコードだけが選択されるからです。 索引付きのデータの場合、メモリに読みこまれる(=ディスクから読みこむ)のは検索条件にヒットしたデータだけです。 また通常DBで使用されるテーブルは固定長レコードです。(各カラム毎にフィールド長が決まっています) CSVのように可変長レコードではありません。 可変長フィールドを扱う場合、可変長フィールドには実際のデータを保持しているファイル等へのポインタしかありません。 このため、可変長フィールドがあっても実レコード長はほぼ固定です。 データが固定長であるため、CSVのように行末文字の検索をする必要がなく、より高速なI/Oが可能になります。 特に索引付きである場合、該当レコードはこのファイルの先頭から何バイト目というように直接読み出すことが可能になるわけです。 その他、SQLで複雑な検索ができたりなど、DBエンジンを使用するメリットは多く、業務アプリケーションには必須といえる存在です。

snake103
質問者

補足

みなさん。回答ありがとうございます。本当にためになります。最後に私の解釈を確認したいのです。 「索引は、HD上のアドレスを保持しているため、特定のレコードだけ読み込む事が出来る。索引をつけない場合、HDのアドレスを特定できないため、ファイルが、バイナリであろうと、csv(テキスト)であろうと、その欲しいレコードまですべて読み込まなければ特定できない。例えば五千件目に記録されてる場合、五千件目のレコードだけほしくても五千件目までのデータすべて読み込むことになってしまう。」 という解釈でよろしいでしょうか?

その他の回答 (2)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

DBエンジンでデータを取り出す場合には おそらく二分木探索(バイナリサーチ)が使用されているものだと思います。 例えば7つのデータがあった場合に 下記のような構造でデータを管理しているのでしょう。 (論理的に、ですが)    4  3   6 1 2 5 7 ここで5番目の値を取り出したい場合は 一番上の4と比較して、それより5が大きいので右下に進みます。 その後、6と比較してそれより5が小さいので左下に進みます。 その後、5と比較してそれと一致するのでそこのデータが 目的のデータとなるわけです。 7つの場合ですが、必ず3回以内の比較で目的のデータ へたどり着くことができます。 1,2,3,4,5,6,7 と並べて順に探索していく場合だと最悪7回比較する 必要があります。 これはデータ数が多ければ多いほど、その差が大きく なっていきます。

snake103
質問者

補足

ありがとうございます。参考になります。 補足で教えて下さい。 1、あるテーブルでどのフィールドにもIndex(索引)=バイナリサーチをつけない場合は、DBエンジンの探し方も、保存形式がバイナリかテキスト化の違いだけで、Perl+csvと同じ上から順に目的のレコードに到達するということですよね? 2、これは、パソコンの基本的動作の質問にはいると思うのですが、 例えば、一万件のレコードをもつファイルが一つあるとします。 そして欲しいレコードが五千件目とわかっているとします。 この場合メモリにバイナリデータでもテキストデータでも一万件のデータ=一つのファイルをすべて読み込んでから上から順に五千件目に到達するのでしょうか?私はプログラム、テキストベースの考え方しか出来ないので、そのファイルを扱う場合、いったんメモリにそのファイルのすべてを読み込むというイメージがわきます。 それとも、その部分だけメモリに読み込むことがバイナリデータの場合可能なのでしょうか? 私の勝手な今の偏見なのですが、可能じゃないとIndexの意味がないと思ってしまうのですが。

  • X-Terra
  • ベストアンサー率48% (25/52)
回答No.1

勿論、圧縮技術なども速さの要因にはなりますが、根本的な理由として、以下が挙げられます。 Perl+CSVの場合、上から順に、ファイルの一行一行をすべてプログラム内で読み込み処理します。データベースシステムの場合は、「索引情報」というものを用いて、直接ファイルを読み込まずに、索引情報を参照し該当したもののポインタやリンク情報を基にデータを吐き出します。 索引には、「田中さんはどこにいるか」という、「番地番号(何行目)」も入っていますので、それを基にデータを読み込む、というわけです。 このような手法は、コンピューターが一般的に(ファイルを読み込むときなどに)行う手法でもあります。デフラグというのは、番地が飛び飛びになったものを順序良く戻す、ということですが、索引を付け直す、というのと同じことをやっているといえましょう。

snake103
質問者

補足

回答ありがとうございます。補足質問させて下さい。 1、索引を使用しない場合、レスポンスの差は圧縮技術の差によるとういこでしょうか?MySQLなどでDBのバックアップをとるとテキストとしてはきだされますが、それはバックパップ用で実際はバイナリとして保存されているということでしょうか? 2、索引を利用するとき、一万件のデータをいったメモリ上に読み込ムわけですよね?その場合csvで順に読み込むとのレスポンスの違いが明確にわかりません。 詳しく教えていただけないでしょうか?よろしくお願いします。

関連するQ&A

  • CSV形式にしてダウンロードするには?

    私はperlとMySQLを使ってインターネットサイトを作っている者です。 プレゼントの申込者をDBに格納しています。 それを何とかcsv形式でインターネットからダウンロードするような仕組みを考えているのですが、思い付きません。 どうかサンプルソースなどをご存知の方は教えて頂けないでしょうか? またその他にエクセルなど、他のファイルだったら簡単だよという情報もお待ちしております。 宜しくお願いします。

  • ハッシュ化するとDBに登録できない

    認証に使用するパスワードをmd5で暗号化してDBへ登録する処理をしています。 その際、暗号化後の文字列に”\r”という文字が入り、DBに登録できないという事象が発生しています。 そう多く発生している訳ではないようなのですが…。 そんなケースに当たった方、いらっしゃいますでしょうか? その場合、どうやってそれを回避されましたか? perlは5.8.5、PostgreSQLは7.4.13です。

    • ベストアンサー
    • Perl
  • DBからのCSVファイルダウンロード

    MySQLに溜めたデータをCSV形式でダウンロードしたいと思っていますが、ダウンロードしたファイルが文字化けして困っています。 PHP、DBともにEUCで作成しているのですが、プログラムの中に文字コードに関する記述が必要になるとは思うのですが、何を追加すればいいのか教えていただけますでしょうか?

    • ベストアンサー
    • PHP
  • ロボット検索にヒットされない仕組みについて

    はじめまして、こんにちは。 ロボット検索にヒットされない仕組みについて教えてください。 はじめにyahooのようなロボット検索でないものは申請がいるのでよね?とゆ~ことは申請さえしていなけれyahoonの検索にヒットすることはないって考えてよかったのでしょうか? それとgoogleのようなロボット検索の場合ですが、これは基本的に申請されているページからリンクをたどってgoogleのDBにサイトを登録していくのでしょうか? もしリンクをたどっていくのなら申請もしてなくて、どこからもリンクされていないページをアップしていた場合はどんなキーワードで検索してもヒットしないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • HTML
  • PHPorCGIでデータ検索

    こんにちは。 PHPで1万件弱のデータを3までのand条件で検索し検索結果を2つのフィールドを使ってソートするプログラムをひこうと思っています。 データの更新はCSVで行うのであくまでも検索のみです。 そこで問題なのは方法なのですが、 このような場合ですとやはりDBを使った方がいいのでしょうか?DBを使用するのだったらMySQLを考えていますが ホスティングサービスの関係でDBを使えないんです。 質問なのですが、 1.上記のような条件でデータをCSVで使って検索やソートができますか? 2.もしできるとしてDBと比べた時に開発のしやすさ、検索結果が表示されるまでのレスポンスはどれくらいの違いがありますか? 3.もしPHPが無理だとしたらCGIとCSVでは可能でしょうか?また可能でしたら2の比較はどうなりますか? 4.今回のような質問を比較しているサイト等ありますか?あったら教えていただけないでしょうか? 自分でも色々と探してみたのですが、どうにも見つからなくて困っています。 ご質問が色々とあって申し訳ございませんが、ご教授をよろしくお願いします。

    • ベストアンサー
    • PHP
  • DBの管理について

    たびたびお世話になります。 WEBで顧客情報を登録してもらいDBで管理する場合ACCESSなどのPCソフトで管理するのと、MYSQLなどと、PHP等でフォームを作成して管理するのではどちらがスムーズに管理できるのでしょうか?管理したい内容は 1・登録情報の追加、削除等 2・登録情報から条件を指定して抽出 3・抽出した所へメール送信 4・登録情報の一括登録(数千件) などを主に考えています。基本的に、データーはMYSQLのDBに登録されている内容を管理したいと思っています。宜しくお願いします

  • DBサーバーはどれがいいのですか?

    MySQL、PostgreSQL、SQLサーバー、ORACLEデータベースについて 仮に、ユーザが5000万人のSNSを作った場合、MySQLやPostgreSQLで対応できますか? 検索に時間がかかったりするのでしょうか? その場合、DBをORACLEにしたほうがいいのでしょうか? ■費用について もし、DBサーバーを1台設置して、ORACLEにした場合、初期費用や毎月のコストはどのくらいになるのでしょうか? ORACLE対応のDBサーバーの金額等も教えて頂ければ幸いです。 あと、SNSの会員が10万人までだとしたら、 MySQL、PostgreSQL、SQLサーバー、ORACLEのうちだと、どれがコスト的に一番効率的でしょうか?

  • DBの文字コード切り替え

    MySQL 5.6 なのですが・・・・ DBの文字コードはDB作成後にデータを登録した後に、途中で文字コードを変更した場合、DBに登録済みの全角文字はどうなりますか? 文字化けする場合、変換ツールのようなものはあるのでしょうか? また文字コードの変更は ini ファイルを変更してMySQLを再起動するだけでいいのでしょうか?

    • ベストアンサー
    • MySQL
  • 【質問】DBを介した検索 他2つ

    現在,大学での演習でコーディングを担当しています. HTMLで作った画面にJavaScriptを用いて機能を作っているのですが… その機能の中に,DBを介した検索機能があります. (DBはMysqlを用いて作成しました.) 他掲示板で質問したところJavaScriptとMysqlのDBは繋がらないとの 指摘を受けたのですが,ODBCというツールを使うことで繋げることが 出来き,とりあえず画面上にDBの内容を表示することは出来ました. (1)しかし,DBと繋ぐことが出来るこの段階でもScriptでDBを介した検索が出来るかが全く分かりません. それと,こちらは一緒に作業をしている友人の質問なのですが, (2)現在htmlを使用し登録画面から確認画面へデータを反映させるようなプログラミングをJavaScriptを用いて作成しています. 登録するデータをODBCを経由しSQL上(workspace)に一度仮保存し,そこから確認画面へとデータを反映させようと考えています. しかし,データは新規のものになるのでデータベースには存在していません.新規のデータはどのような表記の仕方をしていいのか困っています. またプログラミングの全体像があまり想像できていません. 何か参考になるサイトやサンプル文等がございましたらお聞かせください. 当方まだ初心者のため,まだ根本的な部分が理解できてないかもしれないのですが… 理解できる方がいましたらご指摘のほどをよろしくお願いします.

  • 掲示板用のDB設計

    PHPとMySQLを組み合わせた掲示板を作成しています。 ただ単にデータを挿入し、投稿日が新しい順に表示するだけではなく、各投稿に対して投稿、返信が出来る掲示板のDB設計に悩んでいます。 (一般的に言う ツリー型 です。) 各レコードにIDを割り振り、あるレコードに対し返信すると、そのレコードのIDが返信レコードに割り振られます。 ただ、この場合、返信に対する返信に元のレコードのIDを割り振ることは出来ず、困っています。 また、ツリー式の掲示板はどのようにしてデータをツリー形式で最新順にSELECTしているのでしょうか?

    • ベストアンサー
    • MySQL