我试图在MySQL 8.0.28中使用覆盖索引(带函数索引)来加速一个大型InnoDB表上的分组查询.
创建覆盖索引:
ALTER TABLE `sp_files`
ADD INDEX `ix_site_header_to_cleaned_text2` (`sp_site_foreign_key`, (length(`cleaned_text`)));
只使用覆盖索引中的字段,我希望MySQL使用索引而不是底层表—所以我希望EXPLAIN
输出的Extra
列显示Using index
:
EXPLAIN
SELECT sp_site_foreign_key,
count(case when length(`cleaned_text`) > 100 then 1 else NULL END) as num1,
count(1) as num2
FROM sp_files USE INDEX (`ix_site_header_to_cleaned_text2`)
GROUP by sp_site_foreign_key;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | sp_files | index | ix_site_header_to_cleaned_text2 | ix_site_header_to_cleaned_text2 | 208 | 105249 | 100 |
你知道为什么它不使用索引吗?
查询的所有字段都包含在ix_site_header_to_cleaned_text2
索引中,所以我希望explain
在Extra
列中显示Using index
.