MySQL全文索引的概念
今天下午下班去吃饭,吃完饭坐电梯上三楼,竟然被困在电梯里面了,当时的感觉还是很刺激的,电梯上升着,突然就掉下来了,像跳楼机一样,突出一个刺激,索性只掉了一层。。。然后由于是下班时间,修电梯的师傅打车来公司,修了半个小时才修好的,我们3个DBA在电梯里面困了一个半小时。困在电梯里的时候,大家在开玩笑说,这个时候要是出个线上的故障,那不得了啊,公司的中流砥柱们都困在电梯里了,哈哈哈。
今天回家比较晚了,简单写写全文索引的概念吧。在日常的业务场景中,我们可能通过字段的数值比较和范围过滤等方法就能完成绝大多数数的查询工作了,但是考虑这样一种场景,你需要做一些关键字的匹配查询,需要基于相似度进行查询,例如你输入"我 帅哥"这两个关键字,其实需要匹配的是包含我和帅哥这两个关键字的内容,顺序可能不一致,例如返回的结果可能是:"我是帅哥","我不是帅哥"。事实上全文索引就是为这种情况设置的。
这样的场景是不是感觉很熟悉,是的,百度的搜索引擎就是这样的,你输入关键字,会根据关键字来匹配相关的文章来供读者查看。这样在庞大的数据量中进行匹配搜索的过程一般不会在关系型数据库中使用,但是在全文索引的基本原理都是一样的。全文索引有自己独特的语法,这些语法帮助这类查询找到某些关键字的记录,全文索引可以支持各种内容的搜索,包含char、varchar以及text的类型,不幸的是,MySQL对于全文索引的支持不是特别好,我们知道MyISAM存储引擎支持全文索引,但是还是存在一些问题,因为表级别的锁会对性能产生影响、数据文件崩溃的恢复等等问题确实存在。
这里我们主要从自然语言的全文索引和布尔全文索引两个方面来简单介绍。所谓的自然语言全文索引,它需要计算每一个文档对象和所要查询的关键字的相关度,以及关键字在文档中出现的次数。在整个全文索引中出现次数最少的词语,匹配的相关度就越高。what?这和我们想象的是不一样的,可能在我们的概念里,这个单词在某个文档中出现的次数比较多,那么这个文档就是我们想要的,事实不是这样的,例如非常常见的单词可能在50%以上的文章中都出现了,那么这个单词肯定不是我们想要搜索的结果,因为太大众化了。这里介绍一下全文索引的语法:
select * from tbl where match (field) against ('a');
其中,field是相关的搜索字段,against中的a是要搜索的字符串。
以上是自然语言的全文索引部分,来看布尔全文索引,其实布尔全文索引也比较好理解,就是在全文索引的基础上添加了一些布尔的运算符号,看下面的介绍:
~smart 不包含smart单词的内容优先级高
smart 文档中必须包含smart
-smart 文档中不能包含smart
smart* 以smart开头的内容优先级高
举个例子吧:
搜索NBA 库里和NBA -库里的结果是完全不相同的,有了-这个符号,则没有出现库里名字的结果会出现的比较靠前。试过chrome,这个结果更加明显。