mysql全文索引是什么


在mysql中,全文索引是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较;而全文索引就是为这种场景设计的。

mysql全文索引是什么

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

引入


概念

全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。全文索引一般是通过倒排索引实现的。

通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

你可能没有注意过全文索引,不过至少应该对一种全文索引技术比较熟悉:各种的搜索引擎。虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。

版本支持

开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

  1. MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
  2. MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
  3. 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

操作全文索引


索引的操作随便一搜都是,这里还是再啰嗦一遍。

创建

  1. 创建表时创建全文索引
create table fulltext_test (
    id int(11) NOT NULL AUTO_INCREMENT,
    content text NOT NULL,
    tag varchar(255),    PRIMARY KEY (id),
    FULLTEXT KEY content_tag_fulltext(content,tag)  // 创建联合全文索引列
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  1. 在已存在的表上创建全文索引
create fulltext index content_tag_fulltext    on fulltext_test(content,tag);
  1. 通过 SQL 语句 ALTER TABLE 创建全文索引
alter table fulltext_test    add fulltext index content_tag_fulltext(content,tag);

修改

修改个 O,直接删掉重建。

删除

  1. 直接使用 DROP INDEX 删除全文索引
drop index content_tag_fulltext    on fulltext_test;
  1. 通过 SQL 语句 ALTER TABLE 删除全文索引
alter table fulltext_test    drop index content_tag_fulltext;

使用全文索引


和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如

select * from fulltext_test 
    where match(content,tag) against('xxx xxx');

注意: match() 函数中指定的列必须和全文索引中指定的列完全相同,否则就会报错,无法使用全文索引,这是因为全文索引不会记录关键字来自哪一列。如果想要对某一列使用全文索引,请单独为该列创建全文索引。

测试全文索引


添加测试数据

有了上面的知识,就可以测试一下全文索引了。

首先创建测试表,插入测试数据

create table test (
    id int(11) unsigned not null auto_increment,
    content text not null,    primary key(id),
    fulltext key content_index(content)
) engine=MyISAM default charset=utf8;insert into test (content) values ('a'),('b'),('c');insert into test (content) values ('aa'),('bb'),('cc');insert into test (content) values ('aaa'),('bbb'),('ccc');insert into test (content) values ('aaaa'),('bbbb'),('cccc');

按照全文索引的使用语法执行下面查询

select * from test where match(content) against('a');select * from test where match(content) against('aa');select * from test where match(content) against('aaa');

根据我们的惯性思维,应该会显示 4 条记录才对,然而结果是 1 条记录也没有,只有在执行下面的查询时

select * from test where match(content) against('aaaa');

才会搜到 aaaa 这 1 条记录。

为什么?这个问题有很多原因,其中最常见的就是 最小搜索长度 导致的。另外插一句,使用全文索引时,测试表里至少要有 4 条以上的记录,否则,会出现意想不到的结果。

牛NIUCMS本地O2O系统 牛NIUCMS本地O2O系统

牛NIUCMS本地O2O系统是一个以php+mysql进行开发的o2o网站系统。NIUCMS是一款强大的网站管理系统。支持智慧城市、智慧小区、智慧乡村、本地生活门户、本地O2O平台的构建。请注意以下几点:1、这套源码必须要服务器支持伪静态,是支持.htaccess规则的伪静态,一般Apache服务器支持,别搞的下载回去以后说什么缺 少文件,其实源码并非缺少文件。2、这套源码请在php 5.4环境下

牛NIUCMS本地O2O系统 0 查看详情 牛NIUCMS本地O2O系统

MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。

这两个的默认值可以使用以下命令查看

show variables like '%ft%';

可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

// MyISAM
ft_min_word_len = 4;
ft_max_word_len = 84;

// InnoDB
innodb_ft_min_token_size = 3;
innodb_ft_max_token_size = 84;

可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 aaaa 的长度大于等于 4。

配置最小搜索长度

全文索引的相关参数都无法进行动态修改,必须通过修改 MySQL 的配置文件来完成。修改最小搜索长度的值为 1,首先打开 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容

[mysqld]innodb_ft_min_token_size = 1ft_min_word_len = 1

然后重启 MySQL 服务器,并修复全文索引。注意,修改完参数以后,一定要修复下索引,不然参数不会生效。

两种修复方式,可以使用下面的命令修复

repair table test quick;

或者直接删掉重新建立索引,再次执行上面的查询,a、aa、aaa 就都可以查出来了。

但是,这里还有一个问题,搜索关键字 a 时,为什么 aa、aaa、aaaa 没有出现结果中,讲这个问题之前,先说说两种全文索引。

两种全文索引


自然语言的全文索引

默认情况下,或者使用 in natural language mode 修饰符时,match() 函数对文本集合执行自然语言搜索,上面的例子都是自然语言的全文索引。

自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过 50% 的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。上面提到的,测试表中必须有 4 条以上的记录,就是这个原因。

这个机制也比较好理解,比如说,一个数据表存储的是一篇篇的文章,文章中的常见词、语气词等等,出现的肯定比较多,搜索这些词语就没什么意义了,需要搜索的是那些文章中有特殊意义的词,这样才能把文章区分开。

布尔全文索引

在布尔搜索中,我们可以在查询中自定义某个被搜索的词语的相关性,当编写一个布尔搜索查询时,可以通过一些前缀修饰符来定制搜索。

MySQL 内置的修饰符,上面查询最小搜索长度时,搜索结果 ft_boolean_syntax 变量的值就是内置的修饰符,下面简单解释几个,更多修饰符的作用可以查手册

  • + 必须包含该词
  • - 必须不包含该词
  • > 提高该词的相关性,查询的结果靠前
  • 降低该词的相关性,查询的结果靠后
  • (*)星号 通配符,只能接在词后面

对于上面提到的问题,可以使用布尔全文索引查询来解决,使用下面的命令,a、aa、aaa、aaaa 就都被查询出来了。

select * test where match(content) against('a*' in boolean mode);

总结


好了,差不多写完了,又到了总结的时候。

MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。

事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。

几个注意点

  1. 使用全文索引前,搞清楚版本支持情况;
  2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
  3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
  4. 对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

【相关推荐:mysql视频教程】

以上就是mysql全文索引是什么的详细内容,更多请关注其它相关文章!


# 都是  # 华蓥出国留学网站推广  # 红眼如何营销推广  # 工作室网站建设招商  # 贵州搜索关键词排名  # 品牌营销推广要写什么内容  # 问答营销推广学校  # 搜梦SEO  # 向中间商推广营销策划  # 湖州抖音seo价格多少  # 文明SEO  # mysql  # 自己的  # 就可以  # 可以使用  # 布尔  # 的是  # 两种  # 自然语言  # 镜像  # 关键词 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  《腾讯相册管家》注销账号方法  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  Google Drive API 认证:服务账户与OAuth 2.0的选择与实践  店铺如何关联视频号推广?视频号推广有什么用?  search中maxlength属性用法解析  b站怎么查看视频的码率_b站视频码率查看方法  DeepSeek超全面指南:入门必看  我的世界游戏平台入口 我的世界官方官网直达链接  《饿了么》拼好饭点外卖教程2025  sf漫画官网登录入口直达_sf漫画官方正版网址  解决CSS background 属性中 cover 关键字的常见误用  背部总是隐隐作痛怎么回事 背痛如何改善  FullCalendar自定义按钮样式定制指南  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法  如何使用 composer 和 aop-php 实现 AOP 编程?  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  申通快件单号查询平台 申通包裹物流动态跟踪  composer licenses 命令:如何检查项目依赖的许可证?  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  《小黑盒》删除历史浏览方法  2025考研成绩查询时间入口分享  如何查询个人病历记录  J*aScript类型数组_TypedArray使用  Fedora怎么安装 Fedora Workstation安装步骤  《知到》打卡课程方法  Retrofit根路径POST请求:@POST("/") 的应用与解析  热血江湖归来医师加点攻略  《下一站江湖2》武器获取方法  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  poki官网最新入口 poki小游戏大全入口  微信客户端如何找回密码_微信客户端忘记密码找回方法  解决异步Python机器人中同步操作的阻塞问题  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  j*a中赋值运算符是什么?  PDF文件去水印平台入口 PDF水印删除网址  Go Goroutine调度与并发执行深度解析  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  OpenWeatherMap API:通过城市名称获取天气预报数据指南  重返未来:1999卡戎全方位攻略  抖音小程序怎么开通?小程序开通条件是什么?  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  使用document.execCommand实现Web文本编辑器加粗/取消加粗  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法 

 2023-04-23

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.