【问题标题】:When does MySQL rebuild a FTS index?MySQL 什么时候重建 FTS 索引?
【发布时间】:2011-11-21 02:49:23
【问题描述】:

如果您想使用MySQL Full Text Search 功能,您可以在类型为 VARCHAR 的字段上定义全文索引。由于行是插入和更新的,mysql 必须保持索引是最新的。我的问题是:MySQL 什么时候重建 FTS 索引?

  • A) 发生影响索引的 INSERT 或 UPDATE 之后立即。
  • B) 当第一个 SELECT 运行时需要最近受 UPDATE 或 INSERT 影响的索引。
  • C) 别的东西。

不必要的背景信息:我的经验似乎认为选项 B。这是对的吗?我之所以问,是因为我一直在经历突然的随机慢查询,这些查询会进行全文搜索,我不知道为什么有些慢而不是其他的慢。我的直觉是,如果他们正在等待 mysql 重建 FTS 索引,查询可能会很慢,但我不知道这是否是 mysql 的工作方式。随机慢查询示例(通常相同的查询在一秒钟内运行),慢日志中没有慢 UPDATE 或 INSERT:

# Query_time: 61.775612  Lock_time: 10.110924 Rows_sent: 20  Rows_examined: 222498
SELECT SQL_CALC_FOUND_ROWS id
FROM members
WHERE
    AND MATCH (bio,profile_text,name) AGAINST ('building surveyor')
    AND MATCH (town, postcode, country) AGAINST ('united kingdom, liverpool');

注意 Lock_time。我在慢速日志中看不到任何其他 INSERT 或 UPDATE,所以我不确定它在等待什么。这就是为什么我猜它可能正在等待 FTS 索引重建?

【问题讨论】:

    标签: mysql full-text-search full-text-indexing query-performance


    【解决方案1】:

    考虑使用... AGAINST('"building surveyor"') 来获取该短语,而不是分散在任何地方的那两个词。

    您使用的是 MyISAM 还是 InnoDB?它们的工作方式不同。

    MyISAM,我认为,更新当插入/更新一行时,FT 索引。

    我认为,InnoDB 将更改排队,并最终将它们写入磁盘。这通常比 MyISAM 的写入速度更快。

    引擎重建索引,除非明确要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多