我想知道覆盖索引是否可以帮助某些行满足来自 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是否在主表中查找everyoption_name
和LONGTEXT对象option_value
,无论它是否短?