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_id
과 recipient_id
. 인덱스 기준은 맨 왼쪽에 기반한다는 점에 유의하십시오.를 참조하는 쿼리 recipient_id
는 내가 제공 한 명령문에서 커버링 인덱스를 사용할 수 없습니다.
또한 MySQL은 SELECT 당 하나의 인덱스 만 사용할 수 있으므로 커버링 인덱스가 쿼리를 최적화하는 가장 좋은 방법입니다.
외래 키 인덱스 중 하나가 이미 매우 선택적인 경우 데이터베이스 엔진은 지정한 쿼리에 해당 인덱스를 사용해야합니다. 대부분의 데이터베이스 엔진은 이러한 상황에서 최적의 인덱스를 선택할 수 있도록 일종의 휴리스틱을 사용합니다. 어느 인덱스도 그 자체로 선택성이 높지 않은 경우, 해당 유형의 쿼리를 많이 사용할 것이라고 말 했으므로 두 키에 빌드 된 인덱스를 추가하는 것이 좋습니다.
이 테이블의 PK 필드를 제거하고에 기본 키 인덱스를 정의 할 수 있는지 고려해야 할 또 다른 것입니다 giver_id
및 recipient_id
필드. 당신은 조합이 독특하기 때문에 아마도 효과가있을 것이라고 말했습니다. 그러나 일반적으로 추가되는 복잡성은 번거로울 가치가 없다고 생각합니다.
고려해야 할 또 다른 사항은 두 접근 방식의 성능 특성이 데이터 세트의 크기와 카디널리티를 기반으로한다는 것입니다. 2 열 인덱스는 특정 데이터 세트 크기 임계 값 또는 정반대의 경우에만 성능이 향상된다는 것을 알 수 있습니다. 정확한 시나리오에 대한 성능 메트릭을 대체 할 수있는 것은 없습니다.
'Programing' 카테고리의 다른 글
iOS Safari – 오버 스크롤을 비활성화하고 스크롤 가능한 div가 정상적으로 스크롤되도록 허용하는 방법은 무엇입니까? (0) | 2020.08.24 |
---|---|
React Native의 iOS 시작 화면 (0) | 2020.08.24 |
Ruby에서 chr ()의 반대는 무엇입니까? (0) | 2020.08.24 |
.axd 파일이란 무엇입니까? (0) | 2020.08.24 |
문자열에 10 자 중 하나가 포함되어 있는지 확인 (0) | 2020.08.23 |