【问题标题】:How do FULLTEXT INDEXES on multiple columns work?多列上的全文索引如何工作?
【发布时间】:2012-09-03 22:00:08
【问题描述】:

在 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);

【问题讨论】:

    标签: mysql sql database indexing


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是 Microsoft SQL Server 语法,以及指向 Microsoft 文档的链接。在 MySQL 中,我认为您需要命名索引。
    【解决方案2】:

    只会创建一个 FULLTEXT 类型的索引。如有必要,该索引将“跨越”多个列。然而,索引本身并不像它们的单词那样索引列。来自documentation

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      来自manual

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

      【讨论】:

      • 问题:列的顺序重要吗?你必须有相同的列,好的,但是顺序呢?我可以在 MATCH 中混合这些列,同时保持相同的多列索引吗?
      • 不,顺序不重要。全文索引中的列可以按任何顺序放置,但在创建全文索引时指定的所有列都必须在 match() 查询中引用。
      • 您可以创建单独的全文索引,但您可能希望使用OR 为结果创建一个集群,而OR 关键字不是一个好的查询优化器。
      猜你喜欢
      • 2016-05-17
      • 2012-05-30
      • 2020-04-13
      • 1970-01-01
      • 2014-02-12
      • 2017-03-12
      • 2022-01-02
      • 2020-10-29
      • 2010-11-03
      相关资源
      最近更新 更多