3

Railsチュートリアル(http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sidebar-database_indices)を読んでいましたが、データベースインデックスの説明について混乱していました。基本的に、著者はO( n)次の例を挙げて、(ログイン用の)電子メールのリストを調べると、インデックスを作成するのがはるかに速くなります。

データベースの索引を理解するには、本の索引の例えを検討することが役立ちます。本では、「foobar」などの特定の文字列のすべての出現箇所を見つけるには、各ページで「foobar」をスキャンする必要があります。一方、本の索引では、索引で「foobar」を検索するだけで、「foobar」を含むすべてのページを確認できます。 ソースhttp ://ruby.railstutorial.org/chapters/modeling-users#sidebar:database_indices **

その例から私が理解しているのは、単語はテキストで繰り返すことができるため、「インデックスページ」は一意のエントリで構成されているということです。しかし、鉄道サイトでは、各メールアドレスがアカウントに固有になるようにログインが設定されているので、各メールを最大1回発生させることができる場合、インデックスを作成するとどのように高速化できるでしょうか。

ありがとう

4

3 に答える 3

4

インデックス作成は、重複については(あまり)重要ではありません。それは秩序についてです。

検索を行うときは、たとえば、すべてのレコードを検索して関心のあるレコードを見つけるのではなく、バイナリ検索を実行して対数時間でデータを見つけることができるような順序が必要です(つまり、インデックスの種類はこれだけではありませんが、おそらく最も一般的です)。

残念ながら、レコード自体は1つの順序でしか配置できません。

インデックスには、検索に使用するデータ(またはそのサブセット)と、実際のデータを含むレコードへのポインター(または何らかの種類)のみが含まれます。これにより、(たとえば)気になる数の異なるフィールドに基づいて検索を実行できますが、各インデックスはそのフィールドごとに並べられているため、すべてのフィールドでバイナリ検索を実行できます。

于 2012-05-11T06:22:53.980 に答える
4

DBと指定された例のインデックスはアルファベット順にソートされているためです。生のテーブル/本はそうではありません。次に考えてみましょう。ソートされていることを知っているインデックスをどのように検索しますか?興味のあるところまで「A」から読み始めないと思います。代わりに、大まかにPOIにスキップして、そこから検索を開始します。基本的に、DBはインデックスと同じにすることができます。

于 2012-05-11T06:22:25.973 に答える
1

インデックスには問題の列の値のみが含まれているため、より高速であり、テーブル全体よりも少ないページ数に分散されます。また、インデックスには通常、必要な読み取り数を制限するためのハッシュテーブルなどの追加の最適化が含まれています。

于 2012-05-11T06:25:11.237 に答える