다중 및 단일 인덱스
MySQL과 몇 년 동안 작업해왔기 때문에 이런 질문을 하는 것이 좀 부끄럽지만, 오, 글쎄.
두 개의 필드가 있는 테이블이 있습니다.a
그리고.b
. 다음 쿼리를 실행합니다.
SELECT * FROM ... WHERE A = 1;
SELECT * FROM ... WHERE B = 1;
SELECT * FROM ... WHERE A = 1 AND B = 1;
성능 관점에서, 적어도 하나의 쿼리에 대해 다음 인덱스 구성 중 적어도 하나가 느려집니까?만약 그렇다면 자세히 설명해 주십시오.
ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);
ALTER TABLE ... ADD INDEX (a, b);
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
'programing' 카테고리의 다른 글
Node.js가 MySQL 8.0에 인증할 수 없습니다. (0) | 2023.10.19 |
---|---|
그 중 하나가 모듈과 이름이 같은 여러 소스 파일로 커널 모듈을 구축하는 것입니다. (0) | 2023.10.19 |
인수를 인수로 하는 함수 전달? (0) | 2023.10.19 |
명령줄 응용 프로그램의 키보드 입력 (0) | 2023.10.19 |
PowerShell로 텍스트 파일 맨 위 줄 제거 (0) | 2023.10.19 |