1. ホーム
  2. mysql

[解決済み] Railsのテーブルでどのようなインデックスを追加するか

2022-06-15 17:38:37

質問

Railsのデータベースについて質問です。

  • xxx_id"のような全ての外部キーに"index"を追加すべきでしょうか?
  • 自動的に作成される "id" 列に "index" を追加する必要がありますか?
  • 自動的に作成された "id" カラムに "index(unique)" を追加する必要がありますか?

  • 2つの外部キーに一度にインデックスを追加した場合 ( add_index (:users, [:category, :state_id]) にインデックスを追加すると、どうなりますか? これは、それぞれのキーにインデックスを追加するのとどう違うのでしょうか?

    class CreateUsers < ActiveRecord::Migration
      def self.up
        create_table :users do |t|
          t.string :name
          t.integer :category_id 
          t.integer :state_id
          t.string :email
          t.boolean :activated
          t.timestamps
        end
      # Do I need this? Is it meaningless to add the index to the primary key?
      # If so, do I need :unique => true ?
      add_index :users, :id 
      # I don't think I need ":unique => true here", right?
      add_index :users, :category_id # Should I need this?
      add_index :users, :state_id # Should I need this?
      # Are the above the same as the following?
      add_index (:users, [:category, :state_id])
      end
    end
    
    

ここまでは素晴らしい回答です。追加の質問です。

  • xxx_idに"index with unique"を追加すればいいんですよね?

どのように解決するには?

<ブロッククオート

xxx_id"のように、すべての外部キーに"index"を追加する必要がありますか?

その方が、このカラムでソートする際の検索が高速化されるため、良いと思います。そして、外部キーはよく検索されるものです。

railsのバージョン5以降では、インデックスは自動的に作成されます。 を参照してください。 .

<ブロッククオート

自動作成された"id"列に"index"を追加する必要がありますか?

いいえ、これはすでにrailsによって行われています

自動的に作成された "id" カラムに "index(unique)" を追加する必要がありますか?

いいえ、上記と同じです。

<ブロッククオート

一度に2つの外部キーにインデックスを追加した場合 ( add_index (:users, [:category_id, :state_id]) にインデックスを追加すると、どうなりますか? これは、それぞれのキーにインデックスを追加するのとどう違うのでしょうか?

では、インデックスは2つのカラムの結合インデックスになります。これは、1つの category_id AND 一つ state_id (本来は category_id ではなく category ) を同時に使用します。

このようなIndexは、次のようなリクエストを高速化します。

# rails 2
User.find(:all, :conditions => { :state_id => some_id, :category_id => some_other_id })

# rails 3
User.where(:state_id => some_id, :category_id => some_other_id)

ここで

add_index :users, :category_id
add_index :users, :state_id

はこれらのリクエストを高速化します。

# rails 2+3
User.find_by_category_id(some_id)
User.find_by_state_id(some_other_id)

# or
# rails 2
User.find(:all, :conditions => {:category_id => some_id})
User.find(:all, :conditions => {:state_id => some_other_id})

# rails 3
User.where(:category_id => some_id)
User.where(:state_id => some_other_id)

xxx_idにquot;index with unique"を追加すればいいんですよね?

いや、そうすると、1つのカテゴリには1人のユーザーしか入れなくなりますが、カテゴリの意味は、より多くの たくさん のユーザーを1つのカテゴリに入れることができるということです。あなたの User モデルには次のようなものがあります。 belongs_to :category そして、Categoryモデルには以下のようなものがあります。 has_many :users . もし has_many の関係がある場合は foreign_key フィールドは一意であってはなりません!

これに関するより詳細な情報については タッドマン の素晴らしい 答え .