범위 쿼리를 위한 인덱스 최적화
카디널리티가 높은 열은 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은 더 많은 핵심 부분을 사용할 수 있어 검색이 더 효율적이기 때문에 이 인덱스를 선택합니다.
결론
위 내용은 범위 쿼리에 더 효율적인 MySQL 인덱스는 무엇입니까? 높거나 낮은 카디널리티 열로 시작합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!