注:以下部分内容来自《MySQL技术内幕:InnoDB存储引擎》,以及我个人的一些理解和引申。如有侵权,请联系我删除,谢谢!
文章目录
一、为什么需要全文索引
我们都知道,InnoDB中主要使用B+树作为索引(以及少量的哈希索引,主要是自适应哈希)。根据B+树的特点,我们可以在有索引的情况下,使用索引的前缀进行查找,例如,检索以“Covid”作为标题开头的疫情新闻:
SELECT * FROM news WHERE topic LIKE 'Covid%';
这是可以实现的。(注意,这里和索引的最左匹配原则没有关系。由于LIKE关键字,这里使用的是范围查询,而最左匹配原则在遇到范围查询时无效。)
然而当我们需要将查询的关键字不在字段的开头(更多情况下的确是这样),那么我们的B+树索引就无法奏效了,例如,检索标题包含“Covid”的疫情新闻:
SELECT * FROM news WHERE topic LIKE '%Covid%';
二、全文索引
1.定义
书上是这样定义全文索引的:
全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种分析和统计。
讲的很清楚。
2.Inverted Index(倒排索引)
之前一直听过倒排索引(比如ElasticSearch里面),读完书才发现,倒排索引实际上是全文索引的一种常见的实现。它的概念和B+树的索引是等级的。
倒排索引有两种具体的表现形式:
- Inverted File Index,表现形式为(单词,单词所在文档ID)
- Full Inverted Index,表现形式为(单词,(单词所在文档ID,具体位置))
可以看到,二者的差别主要是后者多存储了一个文档中的具体位置,虽然需要维护额外的存储空间,但也更方便我们迅速找到相应的具体段落。InnoDB中的实现也是基于后者的。
三、InnoDB的实现
InnoDB从1.2.x版本开始支持全文索引。
1. Auxiliary Table(辅助表)
作为索引,肯定需要空间进行存储。对于全文索引来说,存储索引的地方即是Auxiliary Table