MySQL全文索引源码剖析之Insert语句执行过程

MySQL全文索引源码剖析之Insert语句执行过程

💡 原文中文,约7600字,阅读约需18分钟。
📝

内容提要

本文介绍了MySQL中的全文索引及其插入过程。全文索引基于倒排索引,支持关键词搜索文档。插入时,文档分词并缓存,分为写入行记录、事务提交和刷脏三个阶段。事务提交时,分词结果添加到缓存,达到阈值后刷新到磁盘,系统崩溃后可恢复缓存数据。

🔎

延伸解读

全文索引的缓存机制与性能权衡

InnoDB为每张含全文索引的表维护一个表级fts_cache_t缓存,插入文档时先分词并缓存,达到阈值后批量刷盘,避免频繁I/O。但缓存内存持续增长可能引发OOM,官方已通过补丁修复。读者需注意,缓存未刷盘时若进程崩溃,数据会丢失,但重启后可从config表恢复。

事务提交对全文索引可见性的影响

全文索引的更新在事务提交阶段完成,未提交时通过全文索引查询不到新插入的记录,但直接SELECT COUNT(*)可以查到行记录。这是因为行记录在写入阶段已插入,而分词和缓存添加在提交阶段才执行。理解这一点有助于避免在事务中误判数据可见性。

刷脏线程与崩溃恢复机制

后台线程fts_optimize_thread从工作队列获取消息,将缓存刷到磁盘辅助表并清空缓存。若刷脏前崩溃,重启后首次insert或select时,会从config表读取已落盘的synced_doc_id,将大于该ID的记录重新分词并恢复到缓存,确保数据不丢失。

❓

Q&A

MySQL中的全文索引是如何工作的?

MySQL中的全文索引基于倒排索引实现,支持关键词搜索文档,通过将文档分词并缓存来提高检索效率。

插入文档时MySQL的处理流程是怎样的?

插入文档时,MySQL分为三个阶段:写入行记录、事务提交和刷脏阶段,分别处理文档ID生成、分词和数据刷新到磁盘。

什么是全文索引Cache,它的作用是什么?

全文索引Cache用于缓存分词结果,避免频繁刷盘,提高性能,直到达到一定阈值后再批量刷新到磁盘。

在事务提交阶段,MySQL是如何处理分词的?

在事务提交阶段,MySQL对文档进行分词,将分词结果添加到Cache中,并判断是否达到刷新阈值。

如果系统崩溃,MySQL如何恢复缓存数据?

系统崩溃后,重启时MySQL会从配置表读取已落盘的同步文档ID,恢复缓存中的数据以确保数据持久性。

MySQL全文索引的刷脏阶段是如何工作的?

刷脏阶段由后台线程处理,将Cache中的数据刷新到磁盘,并清空Cache以恢复初始状态。

🏷️

标签

➡️

继续阅读