-
概述:
在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:
SELECT * FROM <表名> WHERE <字段名> like ‘%ABC%’
但是它的效率太低,是全盘扫描。
Mysql 提供了更高效的方法全文索引(FULLTEXT)
-
重要:
-
Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引。
-
只有char、varchar、text类型字段能创建全文索引。
-
当大量写入数据时,建议先写入数据,后再建立全文索引,提高效率。
-
Mysql内置ngram 解析器,可以解析中日韩三国文字。有汉字的一定要启用它。
-
英文分词用空格,逗号;中文分词用 ngram_token_size 设定,后面有讲解。
-
全文索引在引用前需要新设定下变量
均在my.ini文件中设定,在 [mysqld]的下面追加
-
需要将搜索短语长度设定合适
// MyISAM
ft_min_word_len = 4; 默认值
ft_max_word_len = 84; 默认值
// InnoDB
innodb_ft_min_token_size = 3; 默认值
innodb_ft_max_token_size = 84; 默认值
//ngram解析器令牌长度----即aiginst()中字符串切分的最小字符长度
ngram_token_size = 2~10 ; 默认值
一般设定:(以下例子均是假定设置如下)
在 [mysqld]的下面追加:
innodb_ft_min_token_size = 1
ft_min_word_len = 1
ngram_token_size = 1
-
设定好后需要关闭mysql服务,再重启mysql服务。在全文查询前,需要先将全文索引删除(如果有),再重新建。
-
创建全文索引
建议建表后新建
ALTER TABLE <表名> add FULLTEXT INDEX <索引名>(字段名1,字段2,,) [ WITH PARSER ngram];
-
全文索引查询
SELECT <字段表> FROM <表名> WHERE MATCH(字段) AGAINST (‘要搜索的关键词’ 搜索模式);
三种全文搜索模式:
-
自然语言模式,默认,一般省略不写
IN NATURAL LANGUAGE MODE,
例子1:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (‘张三’ );
查找包含张,或三,或张三的记录,与‘+张三’ ,张三”,+张三” 结果相同
-
布尔搜索模式:
IN NATURAL LANGUAGE MODE
《+》----------必须包含此字符串
《-》----------必须不包含此字符串
《“ ”》--------双引号内作为整体不能拆词
《*》---------通配符,匹配任意字符
例子1:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (‘张三’ IN BOOLEAN MODE);
查找含有张三的记录,与‘+张三’,的结果都相同
例子2:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’“张三”’ IN BOOLEAN MODE);
查找包含张三的记录,“张三”作为整体,与+”张三”结果相同,与上面例一的结果也相同。
例子3:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’+“美女” & +“动人”’ IN BOOLEAN MODE);
查询有‘美女’的又有‘动人’的记录,“美女"与"动人”
例子4:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’“美女” & “动人”’ IN BOOLEAN MODE);
查询有‘美女’的或有‘动人’的记录,“美女"或"动人”
-
查询扩展搜索,使用较少bufen
搜索字符串用于执行自然语言搜索,然后,搜索返回的最相关行的单词被添加到搜索字符串,并且再次进行搜索,查询将返回来自第二个搜索的行。
-
总结:
a) 对于布尔模式,默认采用整体方式。
b) 对于自然模式,默认不采用整体方式。
文中如有不正确之处还请告知:376372062@qq.com ,不胜感谢。
部分参考出处:
参考出处
MYSQL8.0全文索引使用概述:在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:SELECT * FROM <表名> WHERE <字段名> like ‘%ABC%’但是它的效率太低,是全盘扫描。Mysql 提供了更高效的方法全文索引(FULLTEXT)重要:Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和...
MySQL
8.0
从第一版release 到现在已经走过了4个年头了,
8.0
版本在功能和代码上做了相当大的改进和重构。和DBA圈子里的朋友交流,大部分还是5.6 ,5.7的版本,少量的走的比较靠前采用了
MySQL
8.0
。为了紧追数据库发展的步伐,能够尽早享受技术红利,我们准备将
MySQL
8.0
引入到有赞的数据库体系。
落地之前 我们会对
MySQL
8.0
的新特性和功能,配置参数,升级方式,兼容性等等做一系列的学习和测试。以后陆陆续续会发布文章出来。本文算是
MySQL
8.0
新特性学习的第一篇吧,聊聊 不可见索引。
不可见索引
不可见索引中的不可见是针对优化器而言的,优化器在做执行计划
这是
MySQL
8.0
参考手册中的
MySQL
教程
本章通过展⽰如何使⽤
mysql
客⼾端程序创建和
使用
简单的数据库来提供
MySQL
的教程介绍。
mysql
(有时称为“终端监视器”或简称“监视器”)是⼀个交互式程序,使您能够连接到
MySQL
服务器、运⾏查询并查看结果。
mysql
也可以⽤于批
处理模式:您预先将查询放件中,然后告诉
mysql
执行该文件的内容。这介绍了
使用
mysql
的两种方式。
普通索引(INDEX):最基本的索引,没有任何限制
唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。
全文索引
(FULLTEXT ):可用于 MyISAM 表,
mysql
5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成
全文索引
很耗时和空间。
联合(组合)索引:为了更多的提高
mysql
效率可建立组合索引,遵循”最左前缀“原
全文索引
(也称全文检索)是目前搜索引擎
使用
的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
全文索引
始终发生在整个列上,并且不支持列前缀索引。
全文索引
只能
使用
InnoDB或 MyISAM表格,并且只能用于创建CHAR, VARCHAR或 TEXT列。
MySQL
提供了一个内置的全文ngram解析器,...
mysql
全文索引
很慢,速度不如like的百分之一
从explain开始说起吧,很显然第一个sql语句压根没用任何索引(key列内什么都没有)!第二个倒是用到索引,却是主键索引,并非你添加的fulltext索引!
接下来,分析下原因:
sql1:执行步骤:先s_a和s_a_t两表笛卡尔集,然后筛选满足on条件的,接...
在
MySQL
8.0
中,JSON索引
使用
多级索引值时,如果其中的值包含横杠(-),可能会导致报错。这是因为
MySQL
使用
横杠作为特殊字符来表示范围查询。所以,如果你的JSON索引值中包含了横杠,可能会与查询语法发生冲突,导致报错。
为了解决这个问题,你可以考虑以下几种方法:
1. 避免在JSON索引值中
使用
横杠,
使用
其他字符或方式来表示需要的值。
2. 对于包含横杠的JSON索引值,可以尝试
使用
引号将其括起来,以避免与查询语法冲突。例如,
使用
单引号或双引号将JSON索引值包裹起来。
需要注意的是,在
使用
JSON索引时,还需要确保你的查询语句与JSON索引的定义和
使用
方式一致,以避免出现其他潜在的问题。
引用<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [
MySQL
——索引与EXPLAIN](https://blog.csdn.net/bskfnvjtlyzmv867/article/details/84844229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]