단점

2013-12-20 2 views
3

documentation on indexes을 읽은 후 나는 거의 항상 데이터베이스에서 읽는 것은 그것에 쓰는 것보다 훨씬 더 자주 수행 (내 경우), 왜 대부분의 인덱스를 만들 수 없습니다 때문에단점

안녕을 생각 테이블의 필드?

올바른 태도입니까? 길게 삽입하는 것을 제외하고는 이것을하는 다른 단점이 있습니까?

물론 인덱스는 실제로 SELECT 문 조건에서 사용하는 필드로 제한됩니다.

답변

5

색인에는 몇 가지 단점이 있습니다.
먼저 공간을 소비합니다. 이것은 중요하지 않지만 테이블이 특히 큰 경우 영향을 미칠 수 있습니다.
둘째, 더 중요한 것은 DML 문이 수정 될 필요가 없으므로 인덱스가 새로운 행을 새로 열 때 이전에 사용 된 값이 DELETE이거나 이전 값이 인덱스 된 열의 값이 아닐 때 성능이 저하된다는 것을 기억해야합니다. 테이블의 데이터이지만 인덱스도 마찬가지입니다. 다시 한번 말하지만, 이것은 주로 애플리케이션 용도에 달려 있습니다. DML이 매우 드물어 성능이 문제가되지 않는다면 이는 고려 대상이 아닐 수도 있습니다.
셋째로 (이 점이 내 첫 번째 지점과 밀접하게 관련되어 있음에도 불구하고) 다른 데이터베이스 객체를 만들 때마다 추가 유지 관리 오버 헤드가 발생한다는 것을 기억하십시오. 가끔씩 다시 작성해야하는 또 다른 색인입니다. 물론 당신이 사용하고있는 RDBMS), 데이터 사전을 쌓아 올리는 또 다른 objet 등이 있습니다.

결론은 모두 usecase입니다. 자주 실행하고이 색인으로 개선 할 수있는 중요한 조회가있는 경우이를 수행하십시오. 파란 달에이 쿼리를 한 번 실행하면 모든 INSERT 문을 느리게하고 싶지 않을 것입니다.

+1

인덱스 *는 또한 DELETE 또는 UPDATE 문을 속도를 늦출뿐만 아니라 속도를 높일 수도 있습니다. –

+1

@a_horse_with_no_name 해당 행을 찾는 속도가 빠르다면 true, true입니다. – Mureinik

0

읽기 작업 중에 많은 색인이있는 (작은) 성능 단점도 있습니다. 더 많이 가질수록 Postgres는 가장 좋은 쿼리 계획을 평가하는 데 더 많은 시간을 소비합니다.

정확하게 말하면 조건에 사용하지 않는 필드에는 색인을 붙일 필요가 없습니다. 인서트 속도가 느려집니다.

모호한 선택도를 제공하는 입력란에 색인이있는 점은 거의 없습니다. 부울 값이 true 또는 false로 설정되어 있는지 여부에 따라 행이 두 개로 나뉘어 진 테이블을 그림으로 그립니다. true 및 false 값이 거의 균등하게 분산되는 경우 해당 필드의 인덱스는 거의 유용하지 않습니다. 인덱스 이 유용 할 수 있습니다. 더 나은 옵션이 없기 때문에 true 및 false 행이 함께 클러스터됩니다. 대조적으로 해당 필드가 90 % 인 경우 10 %의 부분 색인 인 false가 유용합니다.

그리고 마지막으로 저장 문제가 있습니다. 각 색인에 공간이 필요합니다. 때로는 (특히 GIN) 인덱싱 된 데이터보다 몇 배 더 중요합니다.