即使查询包含索引提示,在MySQL中也不使用索引 MySQL 5.6

即使查询包含索引提示,在MySQL中也不使用索引 MySQL 5.6,mysql,indexing,Mysql,Indexing,考虑下表: create table mytbl ( id long primary key, digest varchar(32) ); 摘要列包含MD5摘要,我通过以下方式在摘要上创建了索引: create fulltext index digest on mytbl (digest); 我随后检查了一个查询: explain select count(id) from mytbl where digest = 'abcde12345ffhhg'; -- a diges

考虑下表:

create table mytbl (
    id long primary key,
    digest varchar(32)
);
摘要
列包含MD5摘要,我通过以下方式在
摘要
上创建了索引:

create fulltext index digest on mytbl (digest);
我随后检查了一个查询:

explain select count(id) from mytbl where digest = 'abcde12345ffhhg';  -- a digest in the table
该计划为(该表有1000行):

然后我打电话询问

explain select count(id) from mytbl use index (digest) where digest = 'abcde12345ffhhg';
但计划保持不变,即不使用索引
摘要

为什么MySQL会忽略
摘要上设置的索引


编辑
我认为我对
CREATE INDEX
语句中的
[fulltext | spatial | unique]
选项有误解。我删除了
全文索引
,然后创建了一个默认索引(
创建索引摘要…
)。因此,MySQL在查询计划中使用了
摘要
索引。

此查询忽略全文索引,因为它没有解释全文搜索的执行计划

要解释全文搜索并使用索引,请使用
MATCH()…frost()


不确定这是否相关,但似乎是…从“对于全文搜索,索引提示的工作方式如下:对于自然语言模式的搜索,索引提示被静默忽略。例如,忽略索引(i1)在没有任何警告的情况下被忽略,并且索引仍在使用。这可能表明MySQL忽略了您的索引提示。仍然没有解释为什么它在没有提示的情况下不使用索引……但我读到的另一篇文章说,对于少量行,MySQL可能会选择不使用索引,可以说是“自动”使用索引。对于少量行,可能会这样做扫描表格要比检查索引快。否则统计数据可能不是最新的。@SamiKuhmonen谢谢。问题中的表格只是一个例子。真正的表格有超过10万行,但索引
摘要
根本没有被使用。@Redbeard011010非常感谢。我试着在
id列上解释select
de>并且确实使用了
索引。请尝试此操作。
解释与('abcde12345ffhhg')匹配(摘要)的mytbl选择计数(id);
explain select count(id) from mytbl use index (digest) where digest = 'abcde12345ffhhg';
EXPLAIN SELECT count(id) FROM mytbl WHERE MATCH(digest) AGAINST ('abcde12345ffhhg');