InnoDB 全文索引报错修复小记

问题

昨天随手看了下数据库容器(MySQL/MariaDB)的日志,发现经常有如下报错。

1
InnoDB: Error (Duplicate key) writing word node to FTS auxiliary index table

通过万能的谷歌,我找到了一点线索:某些包含全文索引字段的表有损坏。但是从日志中看不出到底是哪些表的异常,在使用的数据库也比较多,一个个去查还挺费事的。

如何解决

定位库表

可以通过以下 SQL 语句查询包含全文索引的数据表:

1
SELECT TABLE_SCHEMA, TABLE_NAME FROM statistics WHERE index_type LIKE 'FULLTEXT%';

查出来发现是 torrentsposts 这两张表有全文索引,对比了下错误日志的时间和站上新种子的添加时间,基本可以确定是 torrents 这张表的问题。

重建索引

确定问题表之后,使用以下 SQL 重建索引,然后就再没看到 FTS 的报错。

1
ALTER TABLE tablename ENGINE=InnoDB;

全文索引与倒排索引

对自然语言处理或者是 ElasticSearch 有了解的同学应该对倒排索引不陌生,InnoDB 的全文索引实质上也是倒排索引:对文本进行分词,存储词和原文本对应行之前的映射关系,同时也会记录词在文本中的位置,以便支持近邻搜索。

参考资料

  • MySQL to find all tables with a Full Text indexed column in them
  • InnoDB Full-Text Index Design
  • how to resolve “InnoDB: Error (Duplicate key) writing word node to FTS auxiliary index table” in mysql
  • MySQL · 引擎特性 · InnoDB 全文索引简介
  • Elasticsearch 之(20)proximity match 近似匹配