MySQL会使用LIKE的覆盖索引吗?

时间:2012-06-12 23:13:17

标签: mysql sql performance

假设我有一个穷人的搜索引擎,我正在搜索产品表......

select
  category_id
from products
where
  description like '%blue%'

我知道你一定在想什么。如果删除前导通配符,查询可以正确使用描述索引。 这不是我要问的。

如果我有以下索引,查询会更好吗?

IX_description (description, category_id)

我认为它只能扫描索引而不是整个表格,但这不是EXPLAIN告诉我的。如果我删除了前导通配符,那么EXPLAIN中的“额外”字段会告诉我我已被覆盖,但是如果我把它放回去,它就不会。

我不应该涵盖这两种情况,因为我只访问category_id和description,尽管使用的描述不同吗?

编辑:

我刚刚意识到这个查询,正如所写的那样,如果产品是多个到一个category_id,那么它并没有真正产生很多语义意义。所以缺少DISTINCT,这会产生正确的索引

 IX_description (category_id, description)

这实际上已经涵盖了。但我仍然想知道为什么它没有像最初所说的那样被覆盖。

1 个答案:

答案 0 :(得分:2)

由于您在类似查询的两端使用通配符,因此MySQL通常没有必要使用该索引。无论如何,进行全表扫描也同样快。

然而......在这里应该可以进行仅索引扫描,所以我想知道它是否没有使用它,因为表上有更新。或者仅仅因为它可能是一个更糟糕的查询计划。

为感兴趣的人提供有关仅索引扫描的更多信息:http://mysqlha.blogspot.nl/2010/11/how-are-index-only-scans-implemented-in.html