1

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

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

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

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

IX_description (description, category_id)

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

我不应该在这两种情况下都被覆盖,因为我只访问 category_id 和 description,尽管使用 description 不同?

编辑:

我刚刚意识到,如果产品是多对一的 category_id,那么所写的这个查询实际上并没有太大的语义意义。所以有一个缺失的 DISTINCT,这使得索引正确

 IX_description (category_id, description)

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

4

1 回答 1

2

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

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

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

于 2012-06-12T23:18:25.757 回答