zoukankan      html  css  js  c++  java
  • Mysql中的全文索引

      以前只是简单听说过Mysql有全文索引,但是一直没有认真去了解过。最近在《MYSQL必知必会》中学习到这个知识点,做下记录。

      

      首先,什么是全文索引?简单来说,全文索引其实就是类似于LIKE语句,把包含一定的字符串的的行记录挑选出来。那么问题来了,既然只是达到这个需求的话使用LIKE就行了,LIKE不行的话也还能使用正则表达式,为什么还要大费周章弄个全文索引出来呢?书上提到了三个原因:

      ①性能,Like通配符和正则表达式通常需要全表扫描,且极少使用表索引,所以这些搜索非常耗时。

      ②不能明确控制,单单使用通配符和正则表达式很难甚至不能明确地控制匹配什么和不匹配什么。

      ③结构不够智能,通配符和正则都是返回所有满足条件的所有行,并且这种返回是相对无序的,不智能的。而全文索引会按照匹配等级对输出结果排序,在前面的更有可能是需要的,更加智能。

    那么怎么使用全文索引呢?

    首先要在创建表的时候启用全文索引

    CREATE TABLE productnotes (

      note_id int NOT NULL AUTO_INCREMENT,

      note_text text NULL,

      FULLTEXT(note_text)

    ) ENGINE=MYISAM;

    这里的FULLTEXT(note_text)就开启了全文索引。开启以后我们就能对note_text使用全文索引,并且在增加更新删除行的时候,Mysql会自动帮我们更新索引。

    全文索引的语法

    SELECT note_text

    FROM productnotes

    WHERE Match(note_text) Against('rabbit');

    注意上面语句的  Match(note_text) Against('rabbit')  ,Match表示针对note_text列进行搜索,Again括号里面指定的东西作为搜索文本。

    那么如果是上面这条语句,Mysql会把所有note_text中含有rabbit的行记录选出来。相当于 LIKE '%rabbit%'  ;

    但是这里必须谈一谈,文章开头所说到的智能是什么意思,问什么会和LIKE不同?实际上,使用全文索引不仅仅只是把所有满足条件的行记录挑选出来,而且会根据  行中词的数目、唯一词的数目、整个索引中词的总数、包含该词的行的数目 这些因素计算出来一个“等级”。等级越大代表越有可能是我们需要的记录, 然后Mysql会把高等级的行记录先显示出来,亦即把更可能是我们需要的搜索结果先显示出来。这就是智能的涵义。

    另外,全文索引还有两种模式:查询扩展和布尔文本搜索。

    查询扩展

    SELECT note_text FROM productnotes

    WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION) ;

    开启了查询扩展,Mysql会返回更多的有可能是我们需要的结果,顾名思义“扩展”嘛。此时Mysql会对数据和索引做两次扫描来完成搜索,步骤如下:

      ①首先,进行基本的全文索引,找出满足条件行。

      ②检查上诉结果,并选出所有有用的词。

      ③Mysql再次进行全文索引,并且 不仅使用原查询词语,而且加上步骤②选出的词。

    布尔文本搜索

    SELECT note_text FROM productnotes

    WHERE Mtach(note_text) Against('heavy -rope* IN BOOLEAN MODE);

    开启了布尔模式之后,我们能通过布尔操作符对查询条件做更加精确的要求。比如说上面语句的功能就是:匹配包含heavy但不包含任意以rope开始的词的行。

    到这里,全文索引的基础知识就这些了,更具体的或者原理还是看书吧。

  • 相关阅读:
    OCI读取单条记录(C)
    共享内存shmget shmat shmdt
    Linux系统下的多线程编程入门
    如何让errno多线程/进程安
    linux的mount(挂载)命令详解
    取得系统时间并以BCD形式保存到字符串中
    电脑上的搜索功能用不了了,怎么办?
    如何建立Linux下的ARM交叉编译环境
    C#网络编程之Http请求
    深入了解Oracle前滚恢复rolling forward(一)
  • 原文地址:https://www.cnblogs.com/clno1/p/12767132.html
Copyright © 2011-2022 走看看