>데이터 베이스 >MySQL 튜토리얼 >범위 쿼리에 더 효율적인 MySQL 인덱스는 무엇입니까? 높거나 낮은 카디널리티 열로 시작합니까?

범위 쿼리에 더 효율적인 MySQL 인덱스는 무엇입니까? 높거나 낮은 카디널리티 열로 시작합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-29 02:55:14594검색

Which MySQL Index Is More Efficient for Range Queries: Leading with High or Low Cardinality Column?

범위 쿼리를 위한 인덱스 최적화

카디널리티가 높은 열은 MySQL에서 인덱스 효율성을 높이는 데 도움이 됩니다. 그러나 범위 쿼리의 경우에는 예외가 적용됩니다.

문제 설명

다음 구조의 테이블을 고려해보세요.

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`),          -- Option 1
  KEY `ef` (`ext`,`filetime`)           -- Option 2
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

파일 시간은 고유하지만 확장 값의 수는 제한되어 있습니다(예: 파일 시간의 카디널리티는 더 높고 파일 시간의 카디널리티는 낮음). 내선). 쿼리에는 다음 조건을 사용하여 두 열이 모두 포함됩니다.

WHERE ext = '...'
AND filetime BETWEEN ... AND ...

fe 또는 ef 중 어느 인덱스가 더 최적입니까?

답변

놀랍게도 , 낮은 카디널리티에도 불구하고 ext를 첫 번째 열로 사용하는 인덱스가 더 효율적입니다. query.

설명

MySQL의 옵티마이저는 인덱스 대안을 분석하여 비용이 가장 낮은 인덱스를 선택합니다. 최적화 추적을 사용하여 이러한 선택의 이유를 관찰할 수 있습니다.

fe(파일 시간 우선)의 경우 MySQL은 범위 조건이 on인 경우에도 'gif' 파일을 찾기 위해 16684개의 행을 스캔해야 한다고 추정합니다. filetime.

그러나 ef(ext first)의 경우 두 인덱스 열을 모두 사용하고 적절한 행으로 빠르게 드릴다운할 수 있는 것으로 추정됩니다. 646.61. MySQL은 더 많은 핵심 부분을 사용할 수 있어 검색이 더 효율적이기 때문에 이 인덱스를 선택합니다.

결론

  • 인덱스에서 동일성 테스트와 관련된 열의 우선 순위를 지정합니다. 카디널리티에 관계없이
  • 쿼리 계획은 첫 번째 '범위'를 넘어 확장되지 않습니다.
  • 이러한 맥락에서 복합 인덱스 및 범위 쿼리에는 카디널리티가 관련이 없습니다.
  • InnoDB는 필터링에 사용되는 것 이외의 인덱스 열을 활용할 수 있습니다("인덱스 조건 사용").

위 내용은 범위 쿼리에 더 효율적인 MySQL 인덱스는 무엇입니까? 높거나 낮은 카디널리티 열로 시작합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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