【问题标题】:MySQL ignores my indexMySQL 忽略我的索引
【发布时间】:2010-12-02 14:39:20
【问题描述】:

我对自己设置索引很陌生。我目前只是在试验它,以了解它是如何工作的,以及在什么情况下数据库会使用索引。

我有一个包含 3 列的简单表格;一个id,一个名字和一个状态。我已经在名称上设置了一个索引,它是一个 CHAR(30) 列。出乎我的意料,MySQL 在以下查询中忽略了这个索引:

SELECT * FROM people WHERE name = 'Peter'
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE people ref name name 90 const 1 使用 where

但是,当使用以下查询时,会使用索引:

SELECT COUNT(*) FROM people WHERE name = 'Peter'
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE people ref name name 90 const 1 使用 where;使用索引

谁能给我解释一下?

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

    “使用索引”表示它使用索引作为“覆盖索引”。当它只需要访问索引来满足查询时就会发生这种情况。

    另一方面,如果“使用索引”不存在,但在“键”列中,索引已命名,则它以“参考”列中描述的方式使用该索引。

    所以在这两种情况下它都使用索引,但只有 COUNT() 使用它作为覆盖索引。

    【讨论】:

      【解决方案2】:

      对于每个查询,“key”列表示“name”——所以,我会说您的两个查询都使用了名为“name”的索引,它可能位于“@987654327”上@" 列——这就是你想要的(引用manual

      key列表示key (index) MySQL 实际决定的 采用。如果 MySQL 决定使用其中之一 要查找的 possible_keys 索引 行,该索引被列为键 价值。

      另外,你只是通过“1”行,这很好(没有全扫描或类似的东西)


      type”表示“ref”,这似乎是件好事:

      所有具有匹配索引值的行 从该表中读取每个 前一个行的组合 表。 ... 如果使用的密钥 只匹配几行,这是一个 良好的连接类型

      ref 可用于索引列 使用 = 或 进行比较 运算符。


      而“ref”列表示“const”——不知道具体是什么意思,但据我所知,这是件好事。

      是什么让您认为您的索引没有用于一列?

      仅供参考,欲了解更多信息:7.2.1. Optimizing Queries with EXPLAIN

      【讨论】:

      • 非常感谢您说清楚。我认为它没有被使用的原因是我希望它在额外的列中明确地说“使用索引”。显然这很愚蠢,我应该自己查找说明表中各列的含义。再次感谢并道歉!
      • "const" 表示您正在使用常量搜索主键或唯一索引,并且最多有一个匹配行。这意味着可以快速检索记录,然后将其保存在内存中,任何其他引用其中列的记录都可以非常快速地获取它们的数据。
      • 感谢您的澄清!
      猜你喜欢
      • 2010-10-31
      • 2017-04-12
      • 2016-09-16
      • 1970-01-01
      • 2012-01-06
      • 2012-12-29
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多