Mysql

MySQL EXPLAIN 不顯示 FULLTEXT 的“使用索引”

  • December 4, 2020

我有一個基本表:

create table fullTextTest
(
   id INT(11) NOT NULL,
   superText CHAR(255) NOT NULL,
   superLongText TEXT NOT NULL,
   primary key (`id`),
   FULLTEXT KEY `superText` (`superText`),
   FULLTEXT KEY `superLongtext` (`superLongtext`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into fullTextTest
   set id=1,
   superText="Hi guys, how is it goin'?",
   superLongtext="Please give me some dummy text to search on!!!"
;

show index from fullTextTest;
| fullTextTest |          0 | PRIMARY       |            1 | id            | A         |           1 |     NULL | NULL   |      | BTREE      |         |
| fullTextTest |          1 | superText     |            1 | superText     | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |
| fullTextTest |          1 | superLongtext |            1 | superLongText | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |

現在,讓我們看看 MySQL 是否正確使用了這個索引:

EXPLAIN select * from fullTextTest where match(superText) AGAINST ("guys" IN BOOLEAN MODE);
| id | select_type | table        | type     | possible_keys | key       | key_len | ref  | rows | Extra       |
+----+-------------+--------------+----------+---------------+-----------+---------+------+------+-------------+
|  1 | SIMPLE      | fullTextTest | fulltext | superText     | superText | 0       |      |    1 | Using where |

“在哪裡使用”向我展示了 EXPLAIN 不懂 FULLText .. 真的很遺憾。

我錯過了什麼 ?

我能理解為什麼會這樣

表中只有一行。

MySQL 查詢優化器將圍繞此經驗法則執行計劃:如果通過索引檢查查詢執行所需的行數超過總行數的 5%,則查詢優化器將不使用該索引並將改為使用表掃描或索引掃描。

表中有多少行?一

索引了多少行?一

由於您將檢查 100% 的行,因此不會選擇鍵控查找。查詢將被執行。您根本沒有足夠的行來證明在搜尋中涉及索引是合理的。這通常適用於任何索引。FULLTEXT 索引往往會在最不方便的時候被 Query Optimizer 拋棄。我早在 2012 年 1 月 26 日就寫過這篇文章

嘗試將更多行載入到表中,至少 21 行,然後重試。

中的“額外” Using index(不要與 混淆Using index conditionEXPLAIN表示 中提到的所有SELECT都包含在INDEX正在使用的列中。

在您的查詢中,所有 3 列都被提及(*of SELECT *),但索引中僅提及一列(superText)。

我所說的適用於EXPLAIN甚至所有形式的INDEX引擎,而不僅僅是FULLTEXTMyISAM。

引用自:https://dba.stackexchange.com/questions/17502