2010-02-28 5 views
65

나는 다음과 직면하고 있으며 무엇이 가장 좋은지 잘 모르겠습니다.두 개의 단일 열 인덱스와 MySQL의 두 개의 열 인덱스가 하나입니까?

다음 표를 고려해보십시오 (큰 크기입니다) :

id PK | giver_id FK | recipient_id FK | date

InnoDB를 사용하고 있으며 이해할 수있는대로 두 개의 외래 키 열에 대한 인덱스가 자동으로 생성됩니다. 그러나 특정 조합 (예 :

SELECT...WHERE giver_id = x AND recipient_id = t)을 일치시켜야하는 많은 쿼리를 수행 할 것입니다.

각 조합은 표에서 고유합니다.

이 열에 2 열 인덱스를 추가하면 어떤 이점이 있습니까? 아니면 이론상 두 개의 개별 인덱스가 충분합니까? 동일합니까?

답변

76

두 개의 단일 열 인덱스가있는 경우, 그 중 하나만 예제에 사용됩니다.

두 개의 열이있는 색인이있는 경우 검색어가 더 빨라질 수 있습니다 (측정해야 함). 두 개의 열 인덱스도 단일 열 인덱스로 사용할 수 있지만 첫 번째 열에 대해서만 사용됩니다.

(A, B)에 색인을 넣고 (B)에 다른 색인을 넣는 것이 유용 할 때도 있습니다. 이렇게하면 열 중 하나 또는 모두를 사용하는 쿼리가 빠르지 만 더 많은 디스크 공간을 사용합니다.

색인을 선택할 때 삽입, 삭제 및 업데이트 할 때의 영향도 고려해야합니다. 더 많은 인덱스 = 느린 업데이트.

21

포함 인덱스와 같은 :

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id); 

는 ... 쿼리가 giver_id 언급, 또는 giver_idrecipient_id의 조합하면 인덱스가 사용될 수 있다는 것을 의미합니다. 인덱스 기준이 가장 왼쪽에 있음을 염두에 두십시오. 오직 recipient_id만을 참조하는 쿼리는 내가 제공 한 내역에서 커버 인덱스를 사용할 수 없습니다.

또한 MySQL은 SELECT 당 하나의 인덱스 만 사용할 수 있으므로 커버 인덱스가 쿼리를 최적화하는 가장 좋은 방법입니다.

+4

'MySQL은 SELECT 당 하나의 색인 만 사용할 수 있습니다.'이것은 더 이상 사실이 아니며, 답변을 편집하여 편집하면 좋을 것입니다. – Davor

+0

왜 커버 링 인덱스가'recipient_id '에 의해 사용되지 않을지 설명해 주시겠습니까? –

+2

@IvoPereira MySQL의 다중 열 인덱스를 사용하면 인덱스의 모든 필드를 왼쪽에서 오른쪽으로 사용할 수 있습니다. 예를 들어'INDEX (col1, col2, col3, col4)'를 가지고 있다면 'col1 ='A '' 나'col1 = 'A'AND col2 = 'B'또는 'col1 ='A 'AND col2 ='B ​​'AND col3 ='C 'AND col4 ='D ​​''그러나이 특정 인덱스는 WHERE col2 ='B ​​' '또는'WHERE col3 = 'C'AND col4 = 'D''검색 필드가 인덱스 정의에서 가장 많이 남지 않기 때문입니다. 이러한 필드를 포함하기 위해 추가 색인을 추가해야합니다. – Slicktrick

3

외래 키 인덱스 중 하나가 이미 매우 선택적인 경우 데이터베이스 엔진은 지정한 쿼리에 대해 외래 키 인덱스 중 하나를 사용해야합니다. 대부분의 데이터베이스 엔진은 그런 상황에서 최적의 인덱스를 선택할 수있는 일종의 경험적 방법을 사용합니다. 두 인덱스가 그 자체로 매우 선택 적이 지 않은 경우, 두 유형의 키를 모두 사용한다는 말 때문에 두 키에 작성된 인덱스를 추가하는 것이 좋습니다.

이 테이블에서 PK 필드를 제거하고 giver_idrecipient_id 필드에 기본 키 인덱스를 정의 할 수있는 경우를 고려해야합니다. 당신은 그 조합이 유일하다고 말했고 아마도 그렇게 할 수있을 것입니다 (당신 만이 대답 할 수있는 많은 다른 조건들이 주어 졌을 때). 일반적으로, 추가 된 복잡성으로 인해 번거 로움을 감수 할 가치가 없다고 생각합니다.

+0

감사 마크, 키 중 하나가 실제로 매우 선택 적이므로 잘되어야합니다. 나는 두 개의 (자동) 인덱스를 제 위치에 유지하고 그것이 시간이 지남에 따라 어떻게 수행되는지 보았다. 또한 수령인 기본 키를 생각해 보았습니다. 그러나 각 필드도 개별적으로 검색 할 수 있어야하므로 PHP 오버 헤드가 추가됩니다. 또한 새 키는 (더 짧은) 정수 대신 (더 긴) 문자열이됩니다. – Tom

0

두 가지 방법의 성능 특성은 데이터 집합의 크기와 카디널리티를 기반으로합니다. 2 열 인덱스는 특정 데이터 집합 크기 임계 값 또는 그 반대의 경우에만 성능이 향상된다는 것을 알 수 있습니다.정확한 시나리오의 실적 통계를 대체 할 수있는 것은 없습니다.

관련 문제