学习MYSQL全文索引

一、什么是mysql全文索引

Full-text indexes are created on text-based columns (CHAR, VARCHAR, or TEXT columns) to speed up queries and DML operations on data contained within those columns.

这个是官网的描述,全文索引是在基于文本的列(CHAR、VARCHAR 或 TEXT 列)上创建的,以加快对这些列中包含的数据的查询和 DML 操作。

二、mysql如何设计的

InnoDB full-text indexes have an inverted index design. Inverted indexes store a list of words, and for each word, a list of documents that the word appears in. To support proximity search, position information for each word is also stored, as a byte offset.

InnoDB全文索引采用倒排索引设计。倒排索引存储单词列表,并且对于每个单词,存储该单词出现的文档列表。为了支持邻近搜索,每个单词的位置信息也被存储为字节偏移量。

什么是倒排索引

倒排索引(Inverted index)是搜索引擎中非常重要的数据结构。它的主要作用是可以通过关键词快速找到包含这个关键词的文档。

倒排索引的基本思想是:

对每一个文档,提取其中的关键词,然后建立一个关键词到文档的映射。也就是为每个关键词建立一个到包含该关键词的文档列表的映射。

比如,对于两个文档:

文档1:我爱吃苹果

文档2:苹果是健康的水果

可以提取以下关键词建立倒排索引:

我:文档1

爱:文档1

吃:文档1

苹果:文档1,文档2

是:文档2

健康:文档2

水果:文档2

这样,当搜索“苹果”这个关键词时,可以快速定位到文档1和文档2。你懂了吗?

三、mysql的全文索引是如何利用倒排索引的

MySQL中的全文索引也是利用倒排索引实现的,主要步骤如下:

  1. 对文档进行分词,提取关键词。MySQL中的全文索引一般是针对文本类型的字段建立的,会将文本内容分词提取词条
  2. 建立词条到文档的倒排索引。将提取的词条和源文档ID建立映射关系,也就是词条到文档ID的倒排索引。
  3. 对搜索查询进行分词,并在倒排索引中快速定位匹配的文档。当一个搜索查询过来时,也要对查询进行分词,然后在倒排索引中快速找到包含查询词条的文档。
  4. 根据匹配的文档ID将相关记录检索出来。有了匹配的文档ID,就可以直接通过ID取出完整的记录了。
  5. 对结果进行相关性排序。FULLTEXT索引会根据词条在文档中的频率、稀有性等因素,计算出相关度分数,并按分数排序返回结果。

通过这样的流程,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;

4.1 创建索引

ALTER TABLE XXX
ADD FULLTEXT INDEX FULL_INDEX (example_index) with parser ngram ;
或者
CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);

创建全文索引,并使用中文分词器。ngram这个是mysql5.7之后提供的中文分词器。

当创建此索引的时候,mysql会隐式的创建一列名为FTS_DOC_ID,可以称之为文档ID(唯一的),所以也会隐式的创建该列的索引,并且是唯一索引,如果你自己显式的创建此字段也是可以的,则您负责管理该列以避免空值或重复值。FTS_DOC_ID值不能重复使用,这意味着FTS_DOC_ID 值必须不断增加。

4.2 分词查询

SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');

查询分词包含Ishmael的文档,即opening_lines字段包含Ishmael的行数据

4.3 高级用法

SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('database AND mysql' IN BOOLEAN MODE);

这将搜索同时包含 'database' 和 'mysql' 的记录。布尔模式可以使用 AND、OR、NOT 等连接词进行组合搜索,等等。

如果不加后面的 in Boolean mode,就默认使用自然语言模式(NATURAL LANGUAGE MODE)。会根据词频、IDF等算法对匹配结果进行评分和排序

五、存在缺点

MySQL全文索引的一些主要缺点包括:

  1. 没有专用的搜索组件功能丰富,性能好

  2. 占用更多存储和内存

全文索引需要存储额外的倒排索引和词频统计信息,因此会占用更多存储空间和内存。

  1. 字段过多会导致查询效率较低

全文索引查询效率相比普通索引会略低一些,并且字段过多也会降低查询效率。

  1. 仅支持文本字段
    全文索引仅可以在文本类型字段上创建,非文本字段无法使用全文索引。
  2. 更多的性能消耗,线程占用
    • 对全文索引字段的更新不会立即反映到全文索引结果中
    • 但新增的记录会被异步地合并到全文索引中
    • 全文索引的内容会被自动定期更新,不需要人工重新索引
    • 索引内容的实时性仍然略低于普通索引,可能存在短暂的延迟不一致。

需要根据实际需求权衡选择是否需要使用全文索引。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容