多列上的FULLTEXT INDEXES如何工作?

The*_*ver 16 mysql sql database indexing

在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');
Run Code Online (Sandbox Code Playgroud)

我刚刚在我的搜索界面中添加了一个用户选项,用户可以从搜索中删除其中一列.所以我能够在不丢失索引的情况下做到这一点,我只使用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');
}
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
ALTER TABLE myTable ADD FULLTEXT 2colsIndex (col1,col2);
Run Code Online (Sandbox Code Playgroud)

Ker*_*mit 9

浏览CREATE FULLTEXT INDEX的手册,它表示您可以通过重复column_name这样来指定多个列:

CREATE FULLTEXT INDEX ON table_name (column_name1 [...], column_name2 [...]) ...
Run Code Online (Sandbox Code Playgroud)

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

  • 这是Microsoft SQL Server语法,以及Microsoft文档的链接.在MySQL中,我认为你需要命名索引. (6认同)

bea*_*off 5

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

手册中:

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


Fél*_*ier 5

只会创建一个 FULLTEXT 类型的索引。如有必要,该索引将“跨越”多个列。但是,索引本身并没有像它们的那样对列进行索引。从文档

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

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

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

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