【问题标题】:Why won't MySQL use my index?为什么 MySQL 不使用我的索引?
【发布时间】:2011-08-10 19:03:35
【问题描述】:

如果我有下表:

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 有什么意义吗?

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

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

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

    另外,我相信MySQL无法理解SUBSTRING(name FROM 1 FOR 1)表达式等价于索引。

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

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

    但这也取决于你的统计数据(提示应该有效)。

    MySQL 的部分索引功能旨在节省空间。 (通常)同时拥有部分和完整列索引确实没有意义。您通常会丢弃较短的那个。可能在极少数情况下它是有意义的,但通常没有意义。

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2018-02-09
      • 1970-01-01
      • 2013-10-29
      • 2016-06-24
      相关资源
      最近更新 更多