21

在 3 列上添加 FULLTEXT INDEX 时,是在 3 列上添加 1 个单个索引,还是添加 3 个单独的索引?

我问这个,因为目前我正在使用这样的 FULLTEXT:

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
SELECT * FROM myTable WHERE MATCH (col1, col2, col3) AGAINST ('word');

我刚刚在我的搜索界面中添加了一个用户选项,用户可以在其中从搜索中删除其中一列。那么我是否能够在不丢失索引的情况下做到这一点,我只使用了 3 列中的 2 列:

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
If (UserOptionRemoveCol == "selected") {
    SELECT * FROM myTable WHERE MATCH (col1, col2) AGAINST ('word');
} else {
    SELECT * FROM myTable WHERE MATCH (col1, col2, col3) AGAINST ('word');
}

或者我是否必须在两列以及三列上创建一个新的 FULLTEXT 索引?

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
ALTER TABLE myTable ADD FULLTEXT 2colsIndex (col1,col2);
4

3 回答 3

11

浏览CREATE FULLTEXT INDEX的手册,它表明您可以通过重复以下方式来指定多个列column_name

CREATE FULLTEXT INDEX ON table_name (column_name1 [...], column_name2 [...]) ...

鉴于此信息,我假设它跨 3 列创建单个索引。此外,我假设它在关于复合索引的从左到右规则下工作(我将通过检查以下语句的执行计划来验证这一点)。因此,必须按该顺序选择复合索引(col1, col2, col3)才能使用它 ( SELECT col1, col2 ...)。如果您要调用col2它,则不会使用索引。

于 2012-09-11T02:28:11.930 回答
7

只会创建一个 FULLTEXT 类型的索引。如有必要,该索引将“跨越”多个列。但是,索引本身对列的索引不如它们的words多。从文档中:

InnoDB FULLTEXT 索引具有倒排索引设计。倒排索引存储单词列表,并且对于每个单词,该单词出现在文档列表中。 [...]

如果您创建一个 FULLTEXT 分组三列,或三个 FULLTEXT 仅分组一,这些列将实际上由 FULLTEXT 元数据表中的条目组成。

当传入的文档被标记化时,各个单词(也称为“标记”)连同位置信息和相关的文档 ID (DOC_ID) 一起插入到索引表中。

基本上,似乎多列 FULLTEXT 与多个单列 FULLTEXT 索引的工作方式相同,因为单词的存储是从列的原始分隔中抽象出来的。

于 2016-11-22T23:33:11.307 回答
5

在 MySQL 中,您需要在您计划使用的每组列上创建一个单独的索引(如果您使用的是自然语言搜索。这可能与布尔搜索不同)。

手册

对于自然语言全文搜索,要求 MATCH() 函数中命名的列与表中某些 FULLTEXT 索引中包含的列相同。[...] 如果您想单独搜索标题或正文,则需要为每列创建单独的 FULLTEXT 索引。

于 2014-11-07T14:47:02.453 回答