2011-03-26 2 views
65

최근 색인의 경이로움을 배웠고 성능이 크게 향상되었습니다. 그러나, 나는 배웠 습니다만, 나는이 질문에 답을 찾을 수없는 것 같습니다.MySQL - 모든 필드를 인덱싱하지 않는 이유는 무엇입니까?

색인은 훌륭하지만 왜 누군가가 모든 필드의 색인을 생성하여 엄청나게 빠른 표를 만들 수 없었습니까? 이 일을하지 않는 것이 좋은 이유가있을 것이라고 확신하지만 서드 필드 테이블에는 3 개의 필드가 있습니까? 30 필드에서 10? 왜 선을 그어야하며, 그 이유는 무엇입니까?

+5

인덱싱 된 항목이 10,000 개 이상인 테이블에 값을 삽입하려고하면 모든 항목이 삽입/삭제 및 각 값에 인덱스가있는 경우 이것은 엄청난 시간 오버 헤드와 약간의 메모리 오버 헤드입니다 –

+3

공간 및 쓰기 성능 외에도 한 가지 더 많은 이유가 있습니다. [단일 테이블 액세스에 여러 인덱스를 사용하는 것은 매우 비효율적입니다] (http : //use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance). 즉, 각 열에 하나의 인덱스가 있어도 WHERE 절에서 여러 열에 액세스하면 선택 성능이 좋지 않습니다. 이 경우 다중 열 인덱스가 가장 좋습니다. –

답변

75

인덱스는 메모리 (RAM)의 공간을 차지합니다. 색인이 너무 많거나 너무 많으면 DB가 디스크를 서로 교환해야합니다. 또한 삽입 및 삭제 시간이 길어집니다 (각 색인은 삽입/삭제/업데이트 된 모든 데이터에 대해 업데이트되어야합니다).

무한한 메모리가 없습니다. 모든 인덱스를 RAM에 맞게 = 좋게 만듭니다.

무한한 시간이 없습니다. 인덱싱이 필요한 열만 인덱싱하면 삽입/삭제/업데이트 성능이 저하됩니다.

+0

일반적인 이해를 돕는 좋은 캐주얼 대답이지만 실제로 인덱스에서 줄을 그리는 위치를 결정하는 데별로 도움이되지 않습니다. 어떻게 알 수 있니? 일반적으로 WHERED 필드에 추가하고 최고가되기를 바랍니다. – Andrew

5

CRUD 요구 사항의 균형을 맞추어야합니다. 테이블에 쓰기가 느려집니다. 선을 그릴 위치는 데이터가 처리되는 방식 (정렬 필터링 등)에 따라 다릅니다.

+0

그리고 모든 색인에는 약간의 데이터베이스 공간이 필요합니다. – Acanthus

+0

@Acanthus : 사용 가능한 가장 작은 하드 드라이브는 ** 기가 바이트 **로 측정됩니다. –

+2

@OMG하지만 Brian이 지적한대로 RAM이 아닙니다. 당신이 필요 이상으로 저장하는 것은 ** 결코 ** 좋은 생각입니다. RAM의 데이터/인덱스 캐싱, 백업 미디어 (테이프 당 맞을 버전 등)는 모두 쓸모없는 색인에 의해 영향을받습니다. – RichardTheKiwi

14

행을 업데이트, 삽입 또는 삭제할 때마다 모든 색인을 업데이트해야합니다. 따라서 인덱스가 많을수록 쓰기 작업에 대한 성능이 저하됩니다.

또한 모든 인덱스는 더 많은 디스크 공간과 메모리 공간 (호출시)을 차지하므로 읽기 작업이 느려질 수 있습니다 (큰 테이블의 경우). Check this out

+4

* MS SQL Server *에 대한 링크입니다. 이 질문은 ** MySQL ** –

+2

@OMG를위한 것입니다. 링크의 대부분의 점이 모든 주요 RDBMS에 적용됩니다. – RichardTheKiwi

+1

@ 리차드 (Reichard aka cyberkiwi) : 색인은 ANSI에서 다루지 않습니다. 각 공급 업체가 비슷한 용어를 사용하는 것은 기적입니다. 그러나 그때조차도 SQL Server와 MySQL만이 "clustered"및 "non-clustered"용어를 사용합니다. 이는 SQL Server에서 MySQL보다 더 많은 것을 의미합니다. 한 공급 업체에 대한 권장 사항을 다른 공급 업체에 적용해야한다는 보장은 없습니다. –

0

인덱싱은 드라이브와 램 모두에서 할당 된 공간을 많이 차지하지만 성능이 크게 향상됩니다. 불행히도 메모리 한계에 도달하면 시스템은 드라이브 공간을 포기하고 성능을 저하시킵니다. 실질적으로, 어떤 종류의 데이터 트래버 싱 알고리즘에 포함되지 않는다고 생각할 수있는 필드를 삽입하거나 검색하지 않는 인덱스로 작성하면 안됩니다 (WHERE 절). 그렇지 않으면해야합니다. 기본적으로 모든 필드의 색인을 생성해야합니다. 인덱싱을 해제 할 것을 고려해야 할 필드는 속도가 필요한 경우가 아니면 중재자 만 쿼리를 사용하는 경우입니다.

관련 문제