2013-05-04 4 views
1

올바른 인덱싱에 대해 의심 스럽습니다. Posgresql을 사용하여 레일 3.2.13을 사용합니다. BTW, 아마 더 관계형 데이터베이스/색인 질문 ...Rails/Postgresql을 사용하여 다중 열 인덱스를 인덱싱

나는이 테이블이 있습니다

# Table name: exams 
# 
# id    :integer   not null, primary key 
# cognomenome :string(255) 
# matricola  :string(255) 
# corsolaurea :string(255) 
# annoaccademico :string(255) 
# blablabla 
# 
# Indexes 
# 
# index_exams_on_annoaccademico (annoaccademico) 
# index_exams_on_cognomenome  (cognomenome) 
# index_exams_on_corsolaurea  (corsolaurea) 
# index_exams_on_matricola  (matricola) 

내가 수천 기록 테이블 (레코드의 nymber를 조회하고 싶습니다를 선형 적으로 매년 증가, 말 500 항목 evey 년, 즉 10 년 동안 5000-6000);

SELECT "exams".* FROM "exams" WHERE (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0 

또는 :

SELECT "exams".* FROM "exams" WHERE (matricola like '%8327483274%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0 

또는 :

SELECT "exams".* FROM "exams" WHERE (annoaccademico = '2013') AND (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0 

또는 :

SELECT "exams".* FROM "exams" WHERE (corsolaurea = 'Infermieristica') AND (upper(cognomenome) like 
'%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0 
012,351

나는 이러한 쿼리의 종류를 확인해야합니다 6,

또는 : 몇 즉

SELECT "exams".* FROM "exams" WHERE (corsolaurea = 'Medicina-Anatomia I' and annoaccademico = '2013') AND (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0 

, 나는 몇 가지와 열 조합을 사용하여 테이블을 조회 annoaccademico corsolaurea cognomenome matricola

항상 나는 열을 기준으로 주문해야 : annoaccademico 내림차순 corsolaurea cognomenome

내 질문 :

1) 테이블 크기를 고려하여 색인을 사용하도록 제안 하시겠습니까? 2) 이미 표시된 것처럼 단일 열에 인덱스를 설정했습니다. 맞습니다 ? 맞아

add_index :exams, [:annoaccademico, :corsolaurea, :cognomenome] 

add_index :exams, [:annoaccademico, :corsolaurea, :matricola] 

: 3) 아마도 나는 두 개의 멀티 컬럼 인덱스처럼 추가 할 필요가?

나에게 분명하지 않은 점은 다음과 같습니다. 선택 조건을 제외하고, 인덱스는 order by 절에도 유용합니까?

양해 해 주셔서 감사합니다/db/sql 통찰력. giorgio solyaris.altervista.org

+0

위와 같은 식에 인덱스를 사용하려면 cognomenome) 그런 다음 해당 표현식에 대한 색인을 작성해야합니다 (예 : "CREATE INDEX ON films ((lower (title));" –

+0

각 쿼리의 실행 계획을 확인하십시오 ('explain analyze select ... '사용). 도움이 될 것으로 생각되는 inddexes를 추가 한 다음 실행 계획을 다시 확인하십시오. 인덱스의 작동 방식에 대한 좋은 소개는 다음을 참조하십시오. http://use-the-index-luke.com –

답변

1

전 데이터베이스가 아닙니다.나는 이런 종류의 질문을 통해 갈 때 내가하는 일입니다 그래서 :

  • 내가이 무거운 쿼리를 수행 할 페이지를 식별, 결국 임시 인증/설정 정적 CURRENT_USER, 나에게 접근을 허용 다른 임시 수정 삭제 이 페이지에 직접 로그인 절차를 거치지 않고
  • 이 페이지에 액세스하는 작은 스크립트를 작성합니다. 100 시간 이상 (페이지로드 시간과 대기 할 준비가 된 시간에 따라 다름)
  • 실행 시간을 적어 두십시오.
  • 내 코드를 수정합니다 (귀하의 경우 : 색인 추가 및 데이터베이스 이전, 그 외의 경우 최적화를 시도하고 있습니다.)
  • 페이지를 한 번만 실행합니다 (레일스가 많은 정보를 캐시에 저장하고 계산에이 오버 헤드를 원하지 않음).
  • 스크립트를 다시 실행하고 결과를 비교합니다.

꺼짐 물론이 완료 될 코드를 필요로하고 데이터베이스를 작성 업 할 다음

내가 사용하고 스크립트 (방금 컬 필요)되어

#!/bin/bash 

time (for ((i=0; i<100;i++)); do curl -s -o /dev/null http://127.0.0.1:3000/my_page; done) 

그래서 내 대답은 : 테스트, 이런 종류의 경우는 귀하의 애플 리케이션과 귀하의 데이터에 따라 다르므로 알아야 할 유일한 방법은 그것을 테스트하는 것입니다.

+0

인덱스 된 컬럼에 대한 값의 수가 적은 경우 일반적으로 인덱스의 유용성이 떨어지게됩니다. 테이블에 어커런스가 거의없는 값은 예외입니다. 따라서 실제로 고유 한 값의 수가 많을수록 인덱스가 더 효과적이됩니다. 또한 문자열 관련 문제에 대해서는 동의하지 않습니다. 문자열 인덱싱은 다른 유형의 값을 인덱싱하는 것만 큼 효과적입니다. –

+0

알았어, 팁 주셔서 감사합니다, 나는 색인에 내 지식을 검토합니다. 내 대답을 편집 할게요 – Benj

+0

감사합니다 Benjamin; 예, 테스트 할 것입니다 :-) –

관련 문제