집 >데이터 베이스 >MySQL 튜토리얼 >높은 카디널리티 열과 낮은 카디널리티 열의 범위 쿼리에 가장 적합한 인덱스 구성(범위 열 먼저 vs. 낮은 카디널리티 열 먼저)은 무엇입니까?
높은 카디널리티 열과 낮은 카디널리티 열이 포함된 범위 쿼리로 작업할 때 어떤 인덱스 구성이 가장 적합합니까?
주어진 시나리오에는 테이블이 있습니다. 'did'와 'filename'에 기본 키가 있는 'files'와 'filetime'에 'fe'라는 두 개의 추가 인덱스가 있습니다. 'ext' 및 'filetime'에 대한 'ext' 및 'ef'. 쿼리에는 범위 조건을 사용하여 'ext' 및 'filetime'을 기반으로 행을 필터링하는 작업이 포함됩니다.
이 쿼리에 어떤 인덱스 구성이 더 효율적인지 살펴보겠습니다.
인덱스 옵션 평가
최적의 인덱스를 결정하기 위해 다음을 사용하여 잠재적인 인덱스 사용량과 비용 추정을 분석할 수 있습니다. 설명:
fe 강제(범위 열 먼저):
EXPLAIN SELECT COUNT(*), AVG(fsize) FROM files FORCE INDEX(fe) WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Forcing ef(낮은 카디널리티 열) 첫째):
EXPLAIN SELECT COUNT(*), AVG(fsize) FROM files FORCE INDEX(ef) WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
분석
EXPLAIN은 'ef'(낮은 카디널리티 열 먼저)를 사용하면 'fe'에 비해 실행 계획이 더 효율적이라고 제안합니다. . 이는 'ef'를 사용하면 최적화 프로그램이 인덱스의 두 열을 모두 사용하여 행을 필터링할 수 있어 예상 비용이 낮아지기 때문입니다.
Optimizer Trace
Optimizer 추적은 다음을 제공합니다. 지수 평가에 대한 추가 통찰력 프로세스:
"potential_range_indices": [ { "index": "fe", "usable": true }, { "index": "ef", "usable": true } ], "analyzing_range_alternatives": { "range_scan_alternatives": [ { "index": "fe", "ranges": [...], "index_only": false, "rows": 16684, "cost": 20022 }, { "index": "ef", "ranges": [...], "index_only": false, "rows": 538, "cost": 646.61 } ] }, "attached_conditions_computation": [ { "access_type_changed": { "table": "`files`", "index": "ef", "old_type": "ref", "new_type": "range", "cause": "uses_more_keyparts" } } ]
결론
Optimizer 추적은 다음을 확인합니다.
따라서 EXPLAIN 출력과 Optimizer 추적을 모두 고려하면 최적의 인덱스 구성은 다음과 같습니다. ef (ext, filetime) - ext 및 filetime 범위 조건을 모두 포함하는 쿼리용. 낮은 카디널리티 열을 인덱스에 먼저 배치함으로써 최적화 프로그램이 두 열을 효과적으로 사용할 수 있도록 하여 보다 효율적인 실행 계획을 세울 수 있습니다.
위 내용은 높은 카디널리티 열과 낮은 카디널리티 열의 범위 쿼리에 가장 적합한 인덱스 구성(범위 열 먼저 vs. 낮은 카디널리티 열 먼저)은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!