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)
上一篇 2022年4月9日 下午1:20
下一篇 2022年4月9日 下午1:20


相关推荐

  • excel如何从字符串中截取指定字符(LEFT、RIGHR、MID三大函数)

    excel如何从字符串中截取指定字符(LEFT、RIGHR、MID三大函数)目录 1 LEFT 函数 2 RIGHT 函数 3 MID 函数 1 LEFT 函数 1 语法 LEFT text num chars 参数 text 必要参数 包含要提取字符的文本字符串 字符串表达式其中最左边的那些字符将被返回 如果 text 包含 Null 将返回 Null num chars 可选参数 数值表达式 指出将返回多少个字符 num chars 必须大于或等于 0 如果省略第二参数 则假设其值为 1 如果为 0 返回零长度字符串 如果大于或等于

    2026年3月18日
    2
  • android apk 签名(平台和普通签名)

    android apk 签名(平台和普通签名)因为做了太多的终端项目,客户总会有自己的apk提供,这时候各种签名问题就来了,最近整理了一下相关知识,分享给大家。签名的用处:1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程…

    2022年6月6日
    80
  • windows cmd切换盘符_cmd如何切换到c盘其他文件

    windows cmd切换盘符_cmd如何切换到c盘其他文件win7cmd下切换到其他盘符cd-dd:\    (必须加-d)

    2026年4月16日
    5
  • 2016总结——在路上,我走到哪儿了?

    时间过的很快,2016年就这么的结束了,而我站在2017年的脚步上回顾我的2016年,现在的心情不知道怎么表达,说是百感交集可能太过于夸张,但是内心的那种波澜,在2017年到来之后,越来越强烈。所以我写下今天的这些,这个迟来的总结,让自己心里舒坦一点。

    2022年2月25日
    44
  • notify() 和 notifyAll() 有什么区别?「建议收藏」

    notify() 和 notifyAll() 有什么区别?「建议收藏」notify()和notifyAll()有什么区别?先解释两个概念。等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的synchronized代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待区别:notify()…

    2025年10月8日
    5
  • 跳频电台的设计与测试挑战

    跳频电台的设计与测试挑战跳频信号的不稳定行为使它们难以捕获 验证和测量 因此 需要更有效的工具和程序来设计和测试采用越来越快的跳频技术的现代无线电现在正在使用一些技术 以确保通过拥塞的无线电频谱进行有效的通信 其中最主要的是软件定义的无线电 sdr 它使软件能够动态控制通信参数 如所用的频带 调制类型 数据速率和跳频方案 军用无线电应用经常采用软件无线电技术 必须在恶意信号干扰十分普遍的关键任务环境中执行 它们可以在各种各样的脚印中找到 从小型便携式装置到车载和船上平台 一些商业应用 例如无线局域网和基于 3g 的蜂窝通信

    2026年3月17日
    1

发表回复

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

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