programing

레일 표에서 어떤 인덱스를 추가할 때

itsource 2022. 10. 14. 21:49
반응형

레일 표에서 어떤 인덱스를 추가할 때

Rails 데이터베이스에 대해 질문이 있습니다.

  • "xx_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"를 추가하면 되는 거죠?

"xx_id"와 같은 모든 외부 키에 "index"를 추가해야 합니까?

이 열에서 정렬할 때 검색이 빨라지므로 더 좋습니다.그리고 외국 열쇠는 많이 검색되는 것입니다.

레일 버전 5에서는 인덱스가 자동으로 작성되므로 자세한 내용은 여기를 참조하십시오.

자동으로 생성된 "id" 열에 "index"를 추가해야 합니까?

아니요, 이 작업은 이미 철도에서 수행됩니다.

자동으로 생성된 "id" 열에 "index(unique)"를 추가해야 합니까?

아니요, 위와 같습니다.

인덱스를 2개의 외부 키에 동시에 추가하는 경우(add_index (:users, [:category_id, :state_id])어떻게 되는 거죠?이것은 각 키에 인덱스를 추가하는 것과 어떻게 다른가요?

그런 다음 인덱스는 두 열의 결합된 인덱스입니다.모든 엔트리를 하나의 엔트리에 입력하지 않는 한 그건 말이 안 돼요.category_id 그리고 하나state_id(그것은,category_id것은 아니다.category)를 동시에 표시합니다.

이와 같은 인덱스는 다음과 같은 요청 속도를 높입니다.

# 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에 "index with unique"를 추가하면 되는 거죠?

아니요. 이렇게 하면 한 카테고리에 한 명의 사용자만 포함될 수 있지만 카테고리의 의미는 더 많은 사용자를 한 카테고리에 포함할 수 있다는 것입니다.고객님의 고객명User모델 이런 거 있어요?belongs_to :category카테고리 모델에는 다음과 같은 것이 있습니다.has_many :users를 가지고 있는 경우has_many의 관계foreign_key필드는 고유하면 안 됩니다!

이에 대한 자세한 내용은 태드먼훌륭한 답변을 참조하십시오.

인덱싱은 까다롭고 미묘한 작업이 될 수 있지만, 어떤 것을 훨씬 쉽게 사용할지 결정할 수 있는 일반적인 규칙이 있습니다.

가장 먼저 기억해야 할 것은 인덱스는 여러 가지 방법으로 작동할 수 있다는 것입니다.A, B, C의 인덱스는 A, B 및 단순 A에도 사용할 수 있으므로 올바르게 정렬하면 인덱스를 보다 다용도로 설계할 수 있습니다.전화번호부는 성, 이름으로 색인되어 있으므로 성을 사용하거나 성과 이름을 조합하여 쉽게 검색할 수 있습니다.그러나 이름을 사용하여 직접 검색할 수는 없습니다.그러려면 별도의 지표가 필요할 겁니다.전화번호도 마찬가지입니다.이 번호도 인덱스로 작성해야 합니다.

이를 염두에 두고 인덱스를 작성하는 방법은 다음과 같습니다.

  • 를 가지고 있는 경우belongs_to-has_many관계 쌍, 사용되는 외부 키에 대한 인덱스가 있어야 합니다.
  • 레코드를 주문하고 페이지 번호가 매겨지는 레코드의 수가 많은 경우 색인 끝에 해당 순서 열을 추가해야 합니다.
  • 를 가지고 있는 경우has_many :through결합 테이블은 복합 키로서 결합에 관련된 두 속성에 대해 고유한 인덱스를 가져야 합니다.
  • 사용자 이름이나 이메일과 같은 고유 식별자를 사용하여 레코드를 직접 가져오는 경우 고유 인덱스가 되어야 합니다.
  • 에서 레코드 세트를 가져오는 경우has_many범위를 사용한 관계, 다음을 포함하는 인덱스가 있는지 확인합니다.has_many외부 키와 스코프 컬럼을 순서대로 입력합니다.

인덱스의 목적은 데이터가 제대로 인덱싱되지 않았을 때 발생하는 "테이블 스캔" 또는 "파일 정렬" 작업을 제거하는 것입니다.

간단히 말하면 어플리케이션에 의해 생성되는 쿼리를 살펴보고 컬럼이 참조되고 있는지 확인합니다.WHERE또는HAVING조건과ORDER BY절은 그 순서로 표시됩니다.

  • 항상 외부 키 색인화
  • 정렬할 열 항상 색인화 기준
  • 모든 고유 필드(데이터베이스 수준에서 고유함을 보증합니다).이행 예:add_index :users, :email, unique: true)
  • 예를 들어 두 가지 방법으로 주문하거나 두 가지 방법으로 검색하는 경우:order by [a, b]또는find where( a and b ), 그러면 이중 인덱스가 필요합니다.

구체적인 예:

다음과 같은 경우:

default_scope :order => 'photos.created_at DESC, photos.version DESC'

다음을 추가해야 합니다.

add_index :photos, [:created_at, :version]

참고: 인덱스는 디스크에서 추가 공간을 차지하며 각 인덱스를 재구축해야 하므로 각 레코드를 만들고 업데이트하는 데 시간이 걸립니다.

크레딧:

https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes,은 사용자가 주문할 created_at, 테이블에 인덱스를 추가해야 합니까?와 위의 답변에 대해 설명합니다.

언급URL : https://stackoverflow.com/questions/3658859/when-to-add-what-indexes-in-a-table-in-rails

반응형