重建 InnoDB 全文索引
- 要使配置的更改生效,必须在修改以下任何全文索引变量后重新生成FULLTEXT索引:
- innodb_ft_min_token_size;innodb_ft_max_token_size;
- innodb_ft_server_stopword_table;
- innodb_ft_user_stopword_table;
- innodb_ft_enable_stopword;
- ngram_token_size。
修改innodb_ft_min_token_size、innodb_tt_max_token_size或ngram_token_size都需要重新启动服务器。
- 要重建InnoDB表的FULLTEXT索引,请使用ALTERTABLE和DROPINDEX和ADDINDEX选项删除并重新创建每个索引。
在具有全文索引的表上运行 OPTIMIZE TABLE 会重建全文索引,删除已删除的文档 ID 并尽可能合并同一个词的多个条目。
要优化全文索引,请启用 innodb_optimize_fulltext_only 并运行 OPTIMIZE TABLE。
示例
set GLOBAL
innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.01 sec)
OPTIMIZE TABLE opening_lines;
运行结果如下:
+----------------------+-----------+------------+-------------+
| Table | Op
| Msg_type | Msg_text |
+----------------------+-----------+------------+-------------+
| test.opening_lines | optimize | status | OK
|
+----------------------+-----------+------------+-------------+
1 row in set (0.01 sec)
注
- 为了避免在大表上全文索引的冗长重建时间,您可以使用Innodb_ft_num_word_optimize选项在各个阶段执行优化。
- Innodb_ft_num_word_optimize选项定义了每次运行表都进行优化的单词数量。默认设置为2000,这意味着每次运行优化表都可以优化2000个单词。随后的优化表操作继续从前面的优化表操作结束的位置。
重建 MyISAM 全文索引
- 如果您修改影响索引的全文变量(ft_min_word_len、ft_max_word_len 或 ft_stopword_file),或者如果您更改停止词文件本身,则必须在进行更改并重新启动服务器后重建 FULLTEXT 索引。
- 要为 MyISAM 表重建 FULLTEXT 索引,执行快速修复操作就足够了:
示例
REPAIR TABLE tbl_name QUICK;
- 或者,使用 ALTER TABLE。在某些情况下,这可能比修复操作更快。
- 每个包含任何 FULLTEXT 索引的表都必须按刚才所示进行修复。否则,对该表的查询可能会产生不正确的结果,并且对该表的修改会导致服务器将该表视为已损坏并需要修复。
- 出现此问题是因为这些参数只有服务器知道。它们不存储在 MyISAM 索引文件中。如果您修改了服务器使用的最小或最大字长或停止词文件值,为避免出现此问题,请为 myisamchk 指定与用于 mysqld 的相同的 ft_min_word_len、ft_max_word_len 和 ft_stopword_file 值。例如,如果您将最小字长设置为 3,则可以像这样使用 myisamchk 修复表:
示例
myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
- 为确保 myisamchk 和服务器对全文参数使用相同的值,请将每个参数都放在选项文件的 [mysqld] 和 [myisamchk] 部分中:
[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3
注
如果使用myisamchk执行修改MyISAM表索引的操作(如修复或分析),则除非另有指定,否则将使用最小字长、最大字长和stopword文件的默认全文参数值重建FULLTEXT索引。这可能导致查询失败。
来自 <https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html>