1

このコードについて理解しようとしています... これは Rails Tutorial Book からのもので、Twitter のようなアプリケーションを作成するプロセスの一部です。

class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end

    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true
  end

end
  • 2 つの列 (follower_id と followed_id) しかないのに、なぜインデックスが必要なのですか?
  • インデックスはそれらを何らかの方法でソートしますか? 2列のテーブルにインデックスを追加するのは少し奇妙に思えます。
  • インデックスは行に対して何をしますか?
  • 索引付けはオプションですか? もしそうなら、なぜ/なぜそれを使わないのですか? 上記のコードでそれを使用することは良い考えですか?

できればすべての質問に答えてください。私はこの概念に頭を悩ませようとしていますが、それについて読んだ後、これらの質問があります。

4

2 に答える 2

3

2 つの列 (follower_id と followed_id) しかないのに、なぜインデックスが必要なのですか?

インデックス作成の必要性は、列の数には依存しません。検索を高速化するために使用されます。テーブルに列が 1 つしかない場合でも、特定の値がその列に存在するかどうかを確認するには、最悪の場合、テーブル全体をスキャンする必要があります。索引があればすぐに答えられます。

インデックスはそれらを何らかの方法でソートしますか? 2列のテーブルにインデックスを追加するのは少し奇妙に思えますか?

いいえ、一般的に、インデックスはテーブル内のデータをソートしません。クラスター化されたインデックスはデータを並べ替えるため、「一般的に」と言います。詳細については、この質問を参照してください。

インデックスは行に対して何をしますか?

繰り返しますが、一般的には何もありません。テーブル内の行をインデックスに関連付けるメカニズムは、DBMS ごとに異なります。インデックス作成は、DBA の作業で最も重要なタスクの 1 つです。その基本的な考え方を教えていただけると助かります。ウィキペディアの記事を読んで、基本を理解してください。

索引付けはオプションですか? もしそうなら、なぜ/なぜそれを使わないのですか?

はい、インデックス作成はオプションです。クエリのパフォーマンスが低下した場合は、インデックスを使用する必要があります。繰り返しますが、異なる DBMS は、クエリのパフォーマンスを監視するためのさまざまなメカニズムを提供しており、パフォーマンスがしきい値を超えて低下した場合に警告するように監視を行う必要があります。経験を積むと、アプリケーションのインデックス作成のニーズのほとんどが最初から明確になるようになります。

上記のコードでそれを使用することは良い考えですか?

それについてはコメントできません。各アプリケーションのインデックス作成のニーズは異なります。過剰なインデックス作成の欠点にも注意する必要があります。多数のインデックスがある場合、更新、挿入、および削除は、インデックスも更新する必要があるため、時間の経過とともに遅くなります。

于 2013-11-12T08:14:13.063 に答える
0

列または列セットのインデックスは、その列または列セットの検索を高速化します。その目的は列の値に関連付けられた行を見つけることであるため、その有用性はテーブル内の列の数とは関係ありません。

いいえ、インデックスはテーブルをソートしません。

インデックスは行に対して何も「実行」しませんが、それが「一意の」インデックスである場合、問題の列を複製する行の作成/更新を防ぎます。

索引付けはオプションです。ルックアップは高速化されますが、書き込み操作にはさらに時間がかかります。それが良いアイデアであるかどうかは、完全にアプリケーションに依存します。

于 2013-11-12T08:12:27.937 に答える