mysql全文索引是什么_Mysql中的全文索引

以前只是简单听说过Mysql有全文索引,但是一直没有认真去了解过。最近在《MYSQL必知必会》中学习到这个知识点,做下记录。首先,什么是全文索引?简单来说,全文索引其实就是类似于LIKE语句,把包含一定的字符串的的行记录挑选出来。那么问题来了,既然只是达到这个需求的话使用LIKE就行了,LIKE不行的话也还能使用正则表达式,为什么还要大费周章弄个全文索引出来呢?书上提到了三个原因:①性能,Like…

大家好,又见面了,我是你们的朋友全栈君。

以前只是简单听说过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开始的词的行。

51f5c25df0321cc51b82860eac0d92f2.png

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127219.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JWT原理解析_变压吸附的原理

    JWT原理解析_变压吸附的原理什么是JWTJSONWebToken(JWT),是一个开放安全的行业标准,用于多个系统之间传递安全可靠的信息.为什么会有JWT在很久很久以前…常见的访问模式是这种的。这个时候因为用户都是通过电脑上的浏览器访问服务端,而由于浏览器有cookie机制,服务端有session机制,所以这个流程是行得通的,伪流程如下随着乔布斯时代的来临,智能手机,微信小程序等用户终端越来越多,服务端需要…

    2022年10月17日
    0
  • 图片加密解密

    图片加密解密创建java项目运行javamain,会在图片路劲下生成加密后的图片packagecom.example;publicclassMyClass{publicstaticvoidmain(String[]args){//加密图片的路劲KMD1.encrypt(“F:/metro.png”);}}

    2022年6月21日
    32
  • 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景详解java动态代理机制以及使用场景

    2022年4月23日
    70
  • vue获取uuid_uuid可以随便给人吗

    vue获取uuid_uuid可以随便给人吗Vue使用uuidcreated(){this.uuid()this.imgurl=“http://www.ironbox1.com/j/code/image?deviceId=”+this.text},methods:{//获取uuiduuid(){vars=[];varhexDigits=“0123456789abcdef”;for(vari=…

    2022年8月10日
    10
  • Docker使用教程超详细[通俗易懂]

    Docker使用教程超详细[通俗易懂]TableofContents1.Docker简介 1.1.Docker守护进程 1.2.Docker客户端 1.3.Docker内部 1.3.1.Docker镜像 1.3.2.Docker仓库 1.3.3.Docker容器 1.4.libcontainer 1.5.命名空间「Namespaces」 1.5.1.pidnamespace 1.5.2.mntnamespace 1.5.3.netnam

    2022年10月16日
    0
  • 远程访问docker容器_docker运行python程序

    远程访问docker容器_docker运行python程序                      Pycharm远程调试服务器中的代码(docker容器内部) 一、首先假设你已启动了一个docker容器,并在启动时将容器的22端口映射到宿主机的10022端口启动示例:dockerrun-d–namedjango_api-p8000:80-p10022:22-p5000:5000–linkmysql_ho…

    2022年8月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号