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_name
LONGTEXT 오브젝트에는,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
'itsource' 카테고리의 다른 글
JavaScript에서 시간대 이름을 얻으려면 어떻게 해야 하나요? (0) | 2022.09.23 |
---|---|
MyISAM과 InnoDB의 비교 (0) | 2022.09.23 |
X-Macros의 실제 사용 (0) | 2022.09.23 |
JavaScript:오류 콘솔에 메시지를 인쇄하려면 어떻게 해야 하나요? (0) | 2022.09.23 |
미리 정의된 개체 대신 페이지 새로 고침 후 Vuex 상태가 null로 변환됩니다. (0) | 2022.09.23 |