programing

다중 및 단일 인덱스

telebox 2023. 10. 19. 22:14
반응형

다중 및 단일 인덱스

MySQL과 몇 년 동안 작업해왔기 때문에 이런 질문을 하는 것이 좀 부끄럽지만, 오, 글쎄.

두 개의 필드가 있는 테이블이 있습니다.a그리고.b. 다음 쿼리를 실행합니다.

  • SELECT * FROM ... WHERE A = 1;
  • SELECT * FROM ... WHERE B = 1;
  • SELECT * FROM ... WHERE A = 1 AND B = 1;

성능 관점에서, 적어도 하나의 쿼리에 대해 다음 인덱스 구성적어도 하나가 느려집니까?만약 그렇다면 자세히 설명해 주십시오.

  1. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);
  2. ALTER TABLE ... ADD INDEX (a, b);
  3. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);

감사합니다. (비고유 인덱스에 대해 말씀드리는 점 참고)

네, 적어도 한 건은 상당히 느립니다.다음 인덱스만 정의하는 경우:

ALTER TABLE ... ADD INDEX (a, b);

... 그다음에 질의SELECT * FROM ... WHERE B = 1;해당 인덱스를 사용하지 않습니다.

복합 키를 사용하여 인덱스를 생성할 때 키의 열 순서가 중요합니다.선택성을 높이기 위해 키의 열 순서를 정렬하는 것이 좋습니다. 가장 선택적인 열은 키의 왼쪽에 있습니다.이렇게 하지 않고 비선택 열을 키의 첫 번째 부분으로 두면 인덱스를 전혀 사용하지 않을 위험이 있습니다. (출처:SQL Server Composite Index 최적화 팁)

지수가 존재하는 것만으로도 속도가 느려진다는 것은 매우 불가능합니다.SELECT쿼리: 사용되지 않을 뿐입니다.

이론적으로 옵티마이저는 더 긴 지수를 잘못 선택할 수 있습니다.(a, b)에 대해서는(a)검색만 하는 쿼리를 제공합니다.a.

실제로는 한 번도 본 적이 없습니다.MySQL는 일반적으로 반대의 실수를 합니다. 더 긴 실수가 존재할 때 더 짧은 지수를 취합니다.

업데이트:

사용자의 경우 모든 쿼리에 대해 다음 구성 중 하나로 충분합니다.

(a, b); (b)

아니면

(b, a); (a)

MySQL두 개의 별도 인덱스를 사용할 수도 있습니다.index_intersect, 그래서 이런 인덱스를 만드는 것.

(a); (b)

또한 를 사용하여 쿼리 속도를 높일 것입니다.a = 1 AND b = 1, 비록 위의 어떤 해결책보다 적은 범위로.

제 블로그에서 이 기사를 읽고 싶을 수도 있습니다.

업데이트 2:

드디어 당신의 질문을 이해한 것 같네요 :)

ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);

탁월한a = 1그리고.b = 1, 에 상당히 좋은a = 1 AND b = 1

ALTER TABLE ... ADD INDEX (a, b);

탁월한a = 1 AND b = 1, 에 거의 탁월한.a = 1, 에게 부족한.b = 1

ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);

세 가지 쿼리에 모두 적합합니다.

SQL은 쿼리를 가장 잘 다루는 인덱스를 선택합니다.A, B의 인덱스는 케이스 1과 케이스 3 모두에 대한 쿼리를 다루지만 2의 경우에는 다루지 않습니다(1차 인덱스 열이 A이므로).

따라서 세 개의 쿼리를 모두 처리하려면 두 개의 인덱스가 필요합니다.

ALTER TABLE ... ADD INDEX (a, b); ALTER TABLE ... ADD INDEX (b)

예를 들어 인덱스 집합 #3이 최적입니다.Mysql은 단일 열 where 절에 대해 단일 A 및 B 지수를 선택하고, A 및 B where 절에 대해 복합 지수를 사용합니다.

언급URL : https://stackoverflow.com/questions/2155656/multiple-and-single-indexes

반응형