假设我有一个穷人的搜索引擎,我正在搜索一张产品表......
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)
这实际上确实被覆盖了。但我仍然想知道为什么它没有像最初所说的那样被涵盖在场景中。