FullText索引

163 阅读3分钟

前言

想的再多,不如行动起来,大家好,我是啊Q,让我们徜徉在知识的海洋里吧。

一起“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第16天, 点击查看活动详情

上一篇章我们介绍了 hash&Hash索引, 这一篇我们介绍一下hash索引和Hash相关的知识。

Mysql全文索引最开始只是MyISAM引擎支持,MYSQL5.6之后的InnoDB引擎开始支持全文索引。今天我们就来介绍一下 全文索引的相关特性。

我们先来看一个列子:

假如有一个表:

id诗的名称(name)作者(author)诗的内容(content)
1静夜思李白床前明月光,疑是地上霜。举头望明月,低头思故乡。
2朝发白帝城李白朝辞白帝彩云间,千里江陵一日还。两岸猿声啼不住,轻舟已过万重山。
3春晓孟浩然春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。

比如我们现在有一个查询:查询包含有“举头望明月”的,那么我们查询是怎么查询的呢?

content like ‘%举头望明月%’ 在这样的查询条件下,我们知道索引将会失效。(采用content like ‘举头望明月%’ ,虽然索引不会失效,但是这样根本查询不出来数据)。那么针对这种有没有办法既可以走索引又可以查询出数据的方法呢?那么就是我们今天介绍的主角啦:FullText。

创建全文索引

语法: create fulltext index index_name on table_name(column); 当然也可以在键表的时候创建好。

删除和查询的方式这里不在赘述,前面的篇章已经介绍。

全文索引查询

语法:SELECT * from table_name where MATCH(table_column) AGAINST('关键字');

示例:

我们来看一下它的执行计划:

从上图我们看到:key:content_idx 是我们建立的全文索引,从 type = fulltext可以看出来。 rows =1 可以看出查询条数为1。 通过执行计划我们可以看出该sql确实是走了全文索引的。

  1. 全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。
  2. 全文索引目前只有char、varchar,text 列上可以被创建。
  3. 在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
  4. MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词。