> 데이터 베이스 > MySQL 튜토리얼 > 높은 카디널리티와 낮은 카디널리티: 범위 인덱스에서 어떤 열이 먼저 와야 합니까?

높은 카디널리티와 낮은 카디널리티: 범위 인덱스에서 어떤 열이 먼저 와야 합니까?

DDD
풀어 주다: 2024-12-08 07:30:15
원래의
970명이 탐색했습니다.

High Cardinality vs. Low Cardinality: Which Column Should Come First in a Range Index?

범위 인덱스의 높은 카디널리티 열 순서

데이터베이스 설계에서 여러 열에 인덱스를 생성할 때 해당 열의 순서는 다음과 같습니다. 범위 쿼리 성능에 큰 영향을 미칩니다. 특히, 높은 카디널리티 열과 낮은 카디널리티 열을 모두 포함하는 쿼리의 경우 인덱스의 최적 열 순서는 직관적이지 않을 수 있습니다.

시나리오:

다음을 고려하세요. 다음 스키마가 있는 테이블:

CREATE TABLE `files` (
  `did` int(10) unsigned NOT NULL DEFAULT '0',
  `filename` varbinary(200) NOT NULL,
  `ext` varbinary(5) DEFAULT NULL,
  `fsize` double DEFAULT NULL,
  `filetime` datetime DEFAULT NULL,
  PRIMARY KEY (`did`,`filename`),
  KEY `fe` (`filetime`,`ext`),          -- This?
  KEY `ef` (`ext`,`filetime`)           -- or This?
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
로그인 후 복사

이 테이블은 약 100만 행의 파일 메타데이터를 저장합니다. filetime 열에는 대부분 고유한 값이 있어 높은 카디널리티를 나타내는 반면, ext 열에는 한정된 수의 값이 있어 낮은 카디널리티를 나타냅니다.

쿼리:

다음 쿼리 ext 및 filetime을 기반으로 파일 정보를 검색하는 데 사용됩니다.

WHERE ext = '...'
  AND filetime BETWEEN ... AND ...
로그인 후 복사

Best Index 선택:

fe 또는 ef 중 어느 인덱스가 이 쿼리에 더 좋을지에 대한 의문이 생깁니다. 직관적으로 카디널리티가 높은 열(파일 시간)이 먼저 있는 인덱스가 더 효율적이라고 가정할 수 있습니다. 그러나 분석에 따르면 그 반대가 사실입니다.

설명:

EXPLAIN 명령을 사용하면 다양한 인덱스 선택에 대한 쿼리 계획을 검사할 수 있습니다.

-- Force index on fe (filetime first)
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;

-- Force index on ef (ext first)
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;
로그인 후 복사

결과에 따르면 카디널리티가 낮은 ext 열을 먼저 사용하는 인덱스 ef가 fe.

Optimizer 추적을 사용한 추가 분석에서는 fe 인덱스를 사용하여 최적화 프로그램이 ext 값을 필터링하기 위해 많은 수의 행(16684)을 스캔하는 것으로 추정했습니다. ef 인덱스를 사용하면 두 인덱스 열을 모두 효율적으로 사용할 수 있고 관련 행(538)만 검색할 수 있습니다.

결론:

범위를 지원하기 위해 복합 인덱스를 생성하는 경우 쿼리의 경우 카디널리티에 관계없이 같음 테스트에 관련된 열(이 경우 ext)을 먼저 배치하는 것이 좋습니다. 이를 통해 쿼리 실행 계획에서 인덱스를 보다 효과적으로 사용할 수 있어 성능이 향상됩니다.

위 내용은 높은 카디널리티와 낮은 카디널리티: 범위 인덱스에서 어떤 열이 먼저 와야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿