为什么MySQL不会使用我的索引?

时间:2011-08-10 19:03:35

标签: mysql indexing

如果我有下表:

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

编辑:问题标题不太正确。

1 个答案:

答案 0 :(得分:2)

为查询使用索引是没有意义的,因为您正在选择全名列。这意味着MySQL不能单独使用索引来满足查询。

此外,我认为MySQL无法理解SUBSTRING(name FROM 1 FOR 1)表达式等同于索引。

但是,如果仅索引可以满足查询,MySQL可能会使用索引。例如:

select count(*)
  from mytable
 where name like 'T%';

但即使这取决于你的统计数据(暗示应该有效)。

MySQL的部分索引功能旨在节省空间。 (通常)同时具有部分和完整列索引是没有意义的。你通常会放弃较短的一个。可能有一个罕见的情况,它有意义,但一般没有意义。