1. 首页
  2. mysql面试题

11-十一、MySQL 面试题 InnoDB 中的全文索引 ( 下 )

MySQL InnoDB 中的全文索引的最后一章节,我们来 InnoDB 全文索引中的那些处理逻辑,包括删除索引逻辑和事务逻辑。

InnoDB 全文索引删除处理

删除具有全文索引列的记录可能会带来辅助索引表中的大量小删除,使得对这些表的并发访问成为性能的瓶颈。

为避免此问题,每当从索引表中删除记录时,已删除文档的文档 ID ( DOC_ID ) 将记录在特殊的 FTS_*_DELETED 表中,同时全文索引仍然会保留索引记录。全文查询返回结果前,会自动过滤掉 FTS_*_ DELETED 表中存储的已删除的文档 ID。

这种设计的好处是删除快速且廉价。缺点是删除记录后索引的大小不会立即减少。

要删除已删除记录的全文索引条目,需要设置 innodb_optimize_fulltext_only = ON 在索引表上运行 OPTIMIZE TABLE 以重建全文索引。

InnoDB 全文检索事务处理

因为使用了缓存和批处理。InnoDB 全文索引的事务处理是非常特殊的。

具体来说,全文索引的更新和插入在事务提交时才真正处理,这意味着全文搜索只能看到已提交的数据。也就是不受事务处理四个级别的控制。

下面示例演示了这种事务处理方式。 全文搜索仅在提交插入的行后返回结果


mysql> CREATE TABLE opening_lines ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, opening_line TEXT(500), author VARCHAR(200), title VARCHAR(200), FULLTEXT idx (opening_line) ) ENGINE=InnoDB; mysql> BEGIN; mysql> INSERT INTO opening_lines(opening_line,author,title) VALUES ('Call me Ishmael.','Herman Melville','Moby-Dick'), ('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'), ('I am an invisible man.','Ralph Ellison','Invisible Man'), ('Where now? Who now? When now?','Samuel Beckett','The Unnamable'), ('It was love at first sight.','Joseph Heller','Catch-22'), ('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'), ('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'), ('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451'); mysql> SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +----------+ | COUNT(*) | +----------+ | 0 | +----------+ mysql> COMMIT; mysql> SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +----------+ | COUNT(*) | +----------+ | 1 | +----------+

MySQL InnoDB 全文索引监控

如果你想要监视和检查 InnoDB 全文索引的特殊文本处理方面,可以通过查询以下 INFORMATION_SCHEMA 表实现

  • INNODB_FT_CONFIG
  • INNODB_FT_INDEX_TABLE
  • INNODB_FT_INDEX_CACHE
  • INNODB_FT_DEFAULT_STOPWORD
  • INNODB_FT_DELETED
  • INNODB_FT_BEING_DELETED

你还可以通过查询 INNODB_INDEXESINNODB_TABLES 表来查看全文索引和表的基本信息。

希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:11-十一、MySQL 面试题 InnoDB 中的全文索引 ( 下 )

    链接:https://www.javajike.com/article/1615.html

« 12-十二、MySQL 面试题 InnoDB 创建 InnoDB 表
10-十、MySQL 面试题 InnoDB 中的全文检索索引 ( 中 )»

相关推荐

QR code