itsource

MySQL이 접두사 인덱스의 쿼리를 충족할 수 있습니까?

mycopycode 2022. 9. 23. 00:17
반응형

MySQL이 접두사 인덱스의 쿼리를 충족할 수 있습니까?

커버링 인덱스가 LONGTEXT 또는 다른 LOB 열의 쿼리를 충족하는 데 도움이 되는지 궁금합니다(MySQL 8, MariaDB 10.5).

다음 표가 있습니다(WordPress 정의).

CREATE TABLE wp_options (
    option_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    option_name VARCHAR(191) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    option_value LONGTEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
    autoload VARCHAR(20) NOT NULL DEFAULT 'yes' COLLATE 'utf8mb4_unicode_ci',
    PRIMARY KEY (option_id) USING BTREE,
    UNIQUE INDEX option_name (option_name) USING BTREE,
    INDEX autoload (autoload) USING BTREE
) ENGINE=InnoDB;

이 쿼리를 실행해야 합니다.

SELECT option_name, option_value FROM wp_options WHERE autoload='yes';

수백 개의 행을 반환합니다(많은 WordPress 설치에서).이러한 행의 대부분은 option_name, option_value 문자열이 상당히 짧지만 긴 문자열이 있는 행도 있습니다.WordPress는 (모든 페이지 보기에서) 이 쿼리를 많이 사용합니다.를 사용합니다.autoload를 만족시키는 지수WHERE조건.

질문입니다.다음과 같은 프레픽스를 포함하는 커버링 인덱스를 정의하면 다음과 같습니다.

 wp_options(autoload, option_name(40), option_value(131))

인덱스 스캔이 짧은 이름과 값에 대한 쿼리를 직접 충족시킬 수 있습니까?또는 MySQL이 메인 테이블에서 검색되는 것은option_nameLONGTEXT 오브젝트에는,option_value짧든 짧든?

프리픽스 인덱스에서 커버링 인덱스의 이점을 얻을 수 없습니다.

필요한 값이 접두사 내에 있더라도 MySQL은 최적화 도구의 계획을 수립하는 시점에는 알지 못합니다.데이터 행을 읽기 전에 옵티마이저가 계획을 세우므로 적어도 일부 행에서는 해당 열의 값이 접두사보다 길다고 가정하고 인덱스 외부에서 나머지 문자열을 읽어야 합니다.따라서 지수에서 읽기만 하여 커버리지수 효과를 활용하지 않는다.

여기에서는 데모를 소개합니다.https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/은 오래된 블로그이기 때문에 현재 버전의 MySQL에 적용되는지 궁금하다면 블로그에 나와 있는 절차를 쉽게 재현할 수 있습니다.

언급URL : https://stackoverflow.com/questions/67318944/can-mysql-satisfy-a-query-from-a-prefix-index

반응형