mysql全文索引是什么

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

mysql全文索引是什么

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

引入

概念

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

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

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

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

版本支持

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

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

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

操作全文索引

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

创建

创建表时创建全文索引

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;

在已存在的表上创建全文索引

create fulltext index content_tag_fulltext    on fulltext_test(content,tag);

通过 SQL 语句 ALTER TABLE 创建全文索引

alter table fulltext_test    add fulltext index content_tag_fulltext(content,tag);

修改

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

删除

直接使用 DROP INDEX 删除全文索引

drop index content_tag_fulltext    on fulltext_test;

通过 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 条以上的记录,否则,会出现意想不到的结果。

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

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

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

show variables like '%ft%';

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

// MyISAMft_min_word_len = 4;ft_max_word_len = 84;// InnoDBinnodb_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 存储引擎的全文索引。

几个注意点

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/340985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 18:11:18
下一篇 2025年11月5日 18:20:59

相关推荐

  • 如何使用PHP和JavaScript在灰色框中显示数据库表中第一列的最大值

    本文档将指导你如何使用PHP和JavaScript从数据库表中获取第一列的最大值,并将其显示在网页上的一个灰色框中。我们将使用AJAX技术实现异步数据获取,并在点击按钮后动态更新显示最大值。本文提供了详细的代码示例和步骤说明,帮助你理解和实现该功能。 前端实现:HTML、JavaScript 首先,…

    2025年12月20日
    000
  • 使用PHP和JavaScript在网页上显示数据库表第一列的最大值

    本文档将指导你如何使用PHP和JavaScript从数据库表中检索第一列的最大值,并在网页上以灰色框显示。我们将使用AJAX技术实现数据的异步加载,提升用户体验。本文提供了完整的代码示例,并详细解释了每个步骤,帮助你轻松实现该功能。 准备工作 在开始之前,请确保你已经具备以下条件: 一个可用的数据库…

    2025年12月20日
    000
  • 如何在网页中以灰色方框显示数据库表中第一列的最大值

    本文将指导你如何使用PHP、JavaScript和AJAX技术,从数据库中获取指定表的第一列最大值,并在网页上以一个灰色的方框显示出来。我们将提供详细的代码示例,并解释每个步骤的关键要点,帮助你理解并实现这一功能。 实现步骤 HTML结构: 首先,在HTML中创建一个按钮,点击该按钮会触发一个Jav…

    2025年12月20日
    000
  • 管理MySQL数据库连接:单实例多数据库场景下的最佳实践

    本文针对在单个MySQL实例中为每个用户分配独立数据库的场景,探讨如何高效管理数据库连接。文章对比了使用changeUser和PoolCluster两种方法,并提出了不使用连接池的替代方案。通过代码示例和优缺点分析,帮助开发者选择最适合自身应用场景的连接管理策略,确保API服务的性能和可维护性。 在…

    2025年12月20日
    000
  • 管理MySQL实例和多个数据库的连接策略

    本文探讨了在Node.js环境中,针对每个用户拥有独立数据库的MySQL实例,如何高效管理数据库连接。文章分析了使用单个连接池并切换用户,以及为每个数据库创建独立连接池的优缺点,并提出了基于连接复用和非连接池的替代方案,旨在帮助开发者选择最适合其应用场景的连接管理策略。 在构建API服务时,针对每个…

    2025年12月20日
    000
  • 使用 Node.js 管理 MySQL 数据库连接:针对多用户数据库的策略

    本文探讨了在 Node.js 环境下,针对每个用户拥有独立数据库的 MySQL 实例,如何高效地管理数据库连接。我们将分析 mysql Node.js 包提供的两种主要连接管理方式:使用单个连接池配合 changeUser 方法,以及使用 PoolCluster 为每个数据库创建独立的连接池。同时,…

    2025年12月20日
    000
  • 如何管理MySQL实例和多个数据库的数据库连接?

    本文将探讨在特定场景下,管理MySQL数据库连接的最佳实践。假设你正在构建一个API服务,每个用户都拥有一个独立的数据库。在这种情况下,如何有效地管理与MySQL实例的连接,以确保性能和安全性,是一个值得深入研究的问题。 在mysql Node.js 包中,主要有两种方式来管理数据库连接: 使用单个…

    2025年12月20日
    000
  • 构建轻量级Node.js网站内容管理后台:文本与图片动态更新

    本文旨在提供一种轻量级解决方案,帮助Node.js开发者快速搭建一个简单的管理后台,实现对网站文本和图片的动态更新。我们将探讨如何利用现有的富文本编辑器,结合Node.js后端逻辑,构建一个易于使用的内容管理系统,无需复杂的框架即可满足基本的内容更新需求。 选择合适的富文本编辑器 对于只需要修改文本…

    2025年12月20日
    000
  • 使用Promise处理数据库异步查询

    使用promise处理数据库异步查询的核心原因在于避免回调地狱并提升代码可读性与错误处理能力。1. promise通过.then()和.catch()实现链式调用,使异步逻辑纵向清晰排列,而非横向嵌套;2. 支持async/await语法,让异步代码更接近同步写法,提高开发体验;3. 集中错误处理机…

    2025年12月20日 好文分享
    000
  • 使用PHP和AJAX动态更新数据库表数据:从数组值到SQL操作

    本文详细阐述了如何通过PHP和AJAX实现数据库表的动态更新。内容涵盖前端HTML表单(特别是动态生成的下拉菜单)的数据收集、JavaScript将数据封装成数组并通过AJAX发送,以及PHP后端如何接收并安全地处理这些数组值来构建和执行SQL更新语句。重点讲解了SQL字符串的正确引用方式、调试技巧…

    2025年12月20日
    000
  • 使用 PHP 和 AJAX 更新数据库:处理数组数据与 SQL 语句构建

    本教程详细阐述如何利用 PHP 和 AJAX 技术,将前端收集的表单数据(特别是来自下拉列表的数组值)高效且安全地更新到数据库。文章将涵盖从前端数据收集、通过 AJAX 异步传输到后端 PHP 接收处理,到构建正确的 SQL UPDATE 语句的关键步骤,并强调 SQL 字符串引号处理、调试技巧及数…

    2025年12月20日
    000
  • PHP与MySQL:通过AJAX和数组高效更新数据库

    本文详细阐述了如何利用PHP、JavaScript(通过AJAX)和MySQL实现数据库表格的动态更新。教程涵盖了从前端HTML表格数据展示、JavaScript收集用户选择项并构建数组,到后端PHP接收数据、正确构建SQL更新语句(特别是字符串引用问题)以及执行批量更新的全过程。同时,强调了SQL…

    2025年12月20日
    000
  • PHP与JavaScript数组协同:实现动态数据库批量更新教程

    本教程详细阐述如何利用PHP与JavaScript数组结合AJAX技术,实现数据库表格的动态批量更新。内容涵盖前端数据收集与传输、后端PHP数据处理与数据库交互,并重点强调SQL语句的正确引用、预处理语句的安全性应用以及提升用户体验和系统健壮性的最佳实践。 核心概念概述 在web应用中,实现用户界面…

    2025年12月20日
    000
  • Node.js如何实现爬虫程序?

    node.js 实现爬虫程序的核心在于利用其非阻塞 i/o 特性高效处理并发请求。1. 使用 axios 或 node-fetch 发起 http 请求,获取 html 内容;2. 利用 cheerio 或 jsdom 解析 html,提取所需数据;3. 采用 async/await 处理异步逻辑,…

    2025年12月20日 好文分享
    000
  • js如何生成ER关系图 数据库ER图生成器实现

    要实现数据库er图生成器,前端javascript负责展示和交互,后端服务提供数据库元数据。具体步骤如下:1. 后端服务(node.js、python、java等)连接数据库(mysql、postgresql、sql server等),查询元数据如表名、字段名、主键、外键等,并整理为json格式供前…

    2025年12月20日 好文分享
    000
  • js如何实现前端埋点统计 用户行为数据采集方案

    前端埋点统计通过记录用户行为数据并分析,以优化产品体验。1.确定埋点目标,如页面浏览、按钮点击等关键行为及所需数据;2.选择埋点方式,包括代码埋点、可视化埋点或无埋点;3.使用javascript监听事件并封装数据,通过fetch api发送至服务器;4.后端接收数据并存储至数据库;5.利用分析工具…

    2025年12月20日 好文分享
    000
  • 如何用JavaScript处理事务?

    在javascript中处理事务需要通过模拟来实现。1)使用promise或async/await来确保操作的顺序性和一致性。2)在node.js中,可以使用knex.js等库来管理数据库事务,确保数据的一致性和完整性。 在JavaScript中处理事务并不是像在数据库系统中那样直接,因为JavaS…

    2025年12月20日
    000
  • 撮合服务中的订单数据如何实现持久化与恢复?

    探讨撮合服务中订单数据的持久化与恢复方案 在撮合服务中,确保订单数据的持久化以及服务启动时的数据恢复是至关重要的环节。如何有效地存储和恢复订单数据,以保证服务的高可用性和数据的一致性,是开发者们普遍关心的问题。本文将详细讨论订单数据在撮合服务中的持久化和恢复,并分析现有方案的潜在问题以及传统撮合引擎…

    2025年12月20日
    000
  • JavaScript中如何连接数据库?

    在javascript中可以通过node.js连接数据库。具体步骤如下:1. 使用mysql模块连接mysql数据库,通过createconnection方法建立连接,并使用query方法执行查询。2. 使用pg模块连接postgresql数据库,通过client类建立连接,并使用query方法执行…

    2025年12月20日
    000
  • 为什么在MyBatis多数据源配置下需要添加test-while-idle等参数来解决连接关闭问题?

    在mybatis多数据源配置下,为什么需要添加test-while-idle等参数来解决连接关闭问题?这个问题在单数据源环境下并不常见,但切换到多数据源配置后,可能会遇到”no operations allowed after connection closed”的错误。让我…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信