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_INDEXES
和 INNODB_TABLES
表来查看全文索引和表的基本信息。
最新评论
徒弟可以A师傅,学生可以A老师,为什么外包不能A正式,我觉得很正常。异性相吸这是宇宙真理
PHP天下第一(狗头叼花)
第一个不需要关注公主号直接给激活码的帖子!
客户端超时断开后,服务端如果没有设置超时机制,那也会继续等待处理,万一这期间有消息到了,那不是就接受到消息处理了,但是也没有办法返回到客户端,导致消息丢失。
企业级GO项目开发实战 Kubernetes权威指南 第六版
https://pan.baidu.com/s/1q3bnTncIACKoTZFxvx7BQw?pwd=ii7n
RabbitMQ精讲,项目驱动落地,分布式事务拔高 有吗?
Spring Cloud Alibaba 微服务架构实战 https://pan.baidu.com/s/1jF5voFRoeF0lYAzAPBWSbw?pwd=chqk