如果我有下表:
CREATE TABLE `mytable` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_first_letter` (`name`(1)),
KEY `name_all` (`name`)
)
MySQL是否会选择在name_first_letter
索引上使用name_all
索引?如果是这样,在什么条件下会发生这种情况?
我做了一些快速测试,即使使用索引提示,我也不确定MySQL是否会选择name_first_letter
索引:
-- This uses name_all
EXPLAIN SELECT name FROM mytable
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T';
-- This uses no index at all
EXPLAIN SELECT name FROM mytable USE INDEX (name_first_letter)
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T';
任何MySQL专家都可以对此有所了解吗?在此专栏中是否还有name_first_letter
?
编辑:问题标题不太正确。
答案 0 :(得分:2)
为查询使用索引是没有意义的,因为您正在选择全名列。这意味着MySQL不能单独使用索引来满足查询。
此外,我认为MySQL无法理解SUBSTRING(name FROM 1 FOR 1)
表达式等同于索引。
select count(*)
from mytable
where name like 'T%';
但即使这取决于你的统计数据(暗示应该有效)。
MySQL的部分索引功能旨在节省空间。 (通常)同时具有部分和完整列索引是没有意义的。你通常会放弃较短的一个。可能有一个罕见的情况,它有意义,但一般没有意义。