多列上的FULLTEXT INDEXES如何工作?

时间:2012-09-11 02:09:29

标签: 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');

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

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

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

来自manual

  

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

答案 2 :(得分:3)

只会创建一个FULLTEXT类型的索引。那个指数将" span"必要时围绕多个列。但是,索引本身不会像列那样为列编制索引。来自documentation

  

InnoDB FULLTEXT索引具有倒排索引设计。倒置索引存储单词列表,并为每个单词存储单词出现的文档列表。[...]

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

  

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

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