3

如果您想使用MySQL 全文搜索功能,您可以在类型为 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 索引重建?

4

1 回答 1

1

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

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

我认为 MyISAM会在插入/更新行时更新FT 索引。

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

除非明确要求,否则引擎都不会重建索引。

于 2015-04-21T02:09:33.443 回答