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%'; |
查出来发现是 torrents
和 posts
这两张表有全文索引,对比了下错误日志的时间和站上新种子的添加时间,基本可以确定是 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 近似匹配