[sql] MySQL에서 두 개의 단일 열 인덱스 대 하나의 두 열 인덱스?

나는 다음과 같은 문제에 직면했고 모범 사례가 무엇인지 잘 모르겠습니다.

다음 테이블을 고려하십시오 (커질 것임).

id PK | giver_id FK | recipient_id FK | 데이트

나는 InnoDB를 사용하고 있으며 내가 이해하는 바에 따르면 두 개의 외래 키 열에 대한 인덱스가 자동으로 생성됩니다. 그러나 다음과 같은 특정 조합을 일치시켜야하는 많은 쿼리도 수행 할 것입니다.

SELECT...WHERE giver_id = x AND recipient_id = t.

이러한 각 조합은 테이블에서 고유합니다.

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



답변

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

두 개의 열이있는 인덱스가있는 경우 쿼리가 더 빠를 수 있습니다 (측정해야 함). 두 열 인덱스는 단일 열 인덱스로도 사용할 수 있지만 처음에 나열된 열에 만 사용할 수 있습니다.

때로는 (A, B)에 대한 인덱스와 (B)에 대한 다른 인덱스를 갖는 것이 유용 할 수 있습니다. 이렇게하면 열 중 하나 또는 둘 모두를 사용하는 쿼리가 빨라지지만 물론 더 많은 디스크 공간을 사용합니다.

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


답변

다음과 같은 커버링 인덱스 :

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);

… 쿼리가 언급 된 경우 인덱스가 사용될 수 있다는 것을 의미 giver_id, 또는 조합 giver_idrecipient_id. 인덱스 기준은 맨 왼쪽에 기반한다는 점에 유의하십시오.를 참조하는 쿼리 recipient_id는 내가 제공 한 명령문에서 포함 인덱스를 사용할 수 없습니다.

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


답변

외래 키 인덱스 중 하나가 이미 매우 선택적인 경우 데이터베이스 엔진은 지정한 쿼리에 해당 인덱스를 사용해야합니다. 대부분의 데이터베이스 엔진은 이러한 상황에서 최적의 인덱스를 선택할 수 있도록 일종의 휴리스틱을 사용합니다. 어느 인덱스도 그 자체로 선택성이 높지 않은 경우, 해당 유형의 쿼리를 많이 사용할 것이라고 말 했으므로 두 키에 빌드 된 인덱스를 추가하는 것이 좋습니다.

이 테이블의 PK 필드를 제거하고에 기본 키 인덱스를 정의 할 수 있는지 고려해야 할 또 다른 것입니다 giver_idrecipient_id필드. 당신은 조합이 독특하기 때문에 아마도 효과가있을 것이라고 말했습니다 (당신 만이 대답 할 수있는 다른 많은 조건을 감안할 때). 그러나 일반적으로 추가되는 복잡성은 번거로울 가치가 없다고 생각합니다.


답변

고려해야 할 또 다른 사항은 두 접근 방식의 성능 특성이 데이터 세트의 크기와 카디널리티를 기반으로한다는 것입니다. 2 열 인덱스는 특정 데이터 세트 크기 임계 값 또는 정반대의 경우에만 성능이 향상된다는 것을 알 수 있습니다. 정확한 시나리오에 대한 성능 메트릭을 대체 할 수있는 것은 없습니다.


답변