>데이터 베이스 >MySQL 튜토리얼 >높은 카디널리티 열과 낮은 카디널리티 열의 범위 쿼리에 가장 적합한 인덱스 구성(범위 열 먼저 vs. 낮은 카디널리티 열 먼저)은 무엇입니까?

높은 카디널리티 열과 낮은 카디널리티 열의 범위 쿼리에 가장 적합한 인덱스 구성(범위 열 먼저 vs. 낮은 카디널리티 열 먼저)은 무엇입니까?

DDD
DDD원래의
2024-12-16 05:49:10171검색

Which Index Configuration (Range Column First vs. Low Cardinality Column First) Is Optimal for Range Queries on High and Low Cardinality Columns?

높은 카디널리티 열과 낮은 카디널리티 열이 포함된 범위 쿼리로 작업할 때 어떤 인덱스 구성이 가장 적합합니까?

주어진 시나리오에는 테이블이 있습니다. '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 추적은 다음을 확인합니다.

  • "fe"(범위 열 우선)는 필터링을 위한 첫 번째 열입니다.
  • "ef"(낮은 카디널리티 열 먼저)는 필터링을 위한 인덱스입니다.
  • 옵티마이저는 복합 인덱스를 생성할 때 카디널리티에 관계없이 범위 조건과 관련된 열의 사용을 우선시합니다.
  • 이 유형의 쿼리에서는 카디널리티가 복합 인덱스와 덜 관련됩니다. 시나리오.

따라서 EXPLAIN 출력과 Optimizer 추적을 모두 고려하면 최적의 인덱스 구성은 다음과 같습니다. ef (ext, filetime) - ext 및 filetime 범위 조건을 모두 포함하는 쿼리용. 낮은 카디널리티 열을 인덱스에 먼저 배치함으로써 최적화 프로그램이 두 열을 효과적으로 사용할 수 있도록 하여 보다 효율적인 실행 계획을 세울 수 있습니다.

위 내용은 높은 카디널리티 열과 낮은 카디널리티 열의 범위 쿼리에 가장 적합한 인덱스 구성(범위 열 먼저 vs. 낮은 카디널리티 열 먼저)은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.