mysql全文索引使用条件

首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持 英文的全文检索。

mysql全文索引使用条件有两个,一个是对表存储引擎类型的要求,二是对设置全文索引字段的类型的要求。

  1. 表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)
  2. 字段类型:只有字段类型为char、varchar和text的字段才能设置全文索引。

mysql如何创建全文索引

全文索引可以在创建表的时候设置,也可以在已有的表中进行设置。

1.创建表时设置全文索引,具体代码如下:

CREATE TABLE IF NOT EXISTS `category` (      `id` int(10) NOT NULL auto_increment,      `fid` int(10) NOT NULL,      `catname` char(255) NOT NULL,      `addtime` char(10) NOT NULL,      PRIMARY KEY  (`id`),      FULLTEXT KEY `catname` (`catname`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

从上面代码可以看出,设置某字段为全文索引的SQL代码为FULLTEXT KEY `catname` (`catname`)

2.再已有的表中为某字段设置全文索引:

ALTER TABLE <table> ADD FULLTEXT (fields)

或者直接在myphpadmin控制台中点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同。

mysql全文索引的基本语法

全文索引搜索语法

MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符])

其中在match里面指定的列名1、2等,就是在建立全文索引中指定的列名, 后面的搜索修饰符说明如下:

search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}

如:

SELECT * FROM tableName WHERE MATCH(fields) AGAINST ('search term')

mysql全文索引实例

首页我们建立表与初始化数据

CREATE TABLE IF NOT EXISTS `category` (      `id` int(10) NOT NULL auto_increment,      `fid` int(10) NOT NULL,      `catname` char(255) NOT NULL,      `addtime` char(10) NOT NULL,      PRIMARY KEY  (`id`),      FULLTEXT KEY `catname` (`catname`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;      /*  http://www.manongjc.com/article/1443.html */
INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES
(1, 0, 'welcome to you!', '1263363380'),
(2, 0, 'hello phpjs,you are welcome', '1263363416'),
(3, 0, 'this is the fan site of you', '1263363673');

在具体实例之前,我们分析下msyql全文检索的语法:函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。说白了就是MATCH给定匹配的列(fulltext类型索引),AGAINST给定要匹配的字符串,多 个用空格、标点分开,mysql会自动分隔。

操作一:

SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')    

返回结果:

id fid catname  addtime
2 0 hello phpjs,you are welcome  1263363416

匹配出了含有phpjs关键字的行数据。

操作二:

SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('this')  

按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?

原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLESLIKE 'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。

操作三:

这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了

SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you') 

返回结果还是为空,大跌眼镜了吧,这又是为什么呢?

原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个 特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是 100%,只有低于50%的才会出现在结果集中。

操作四:

有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?

mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索

SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE) 

总结:

  1. 要注意最小字符的长度;
  2. 要注意关键词的权重;

mysql中的like在有一些情况下是无法使用索引的,但是在数据量不是很大的时候效率也不低

先建立一张表:

-- 创建表
CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMARY KEY(id)
);

再在uname字段上创建索引:

-- 添加索引
ALTER TABLE test ADD INDEX uname_index (uname);-- 查看索引
SHOW INDEX FROM test;
![](https://img2018.cnblogs.com/blog/905539/201810/905539-20181010143352460-197551940.png)-- 添加记录
INSERT INTO test VALUES((1,'jay'),(2,'ja'),(3,'bril'),(4,'aybar');

检测结果:

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';

这么看来 %的使用对索引似乎没有印象,但是再加一个普通不是索引的字段

--添加一个非索引字段
ALTER TABLE `test`
ADD COLUMN `status`  int(11) UNSIGNED NULL DEFAULT 1 AFTER `uname`

再次检测:
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';

这次的结果是: like后直接跟%号的匹配的查询不使用索引;like后先跟匹配值%,就会使用到索引。

----疑问???
|那么为啥加了一个字段后会有这样的区别呢?之前的字段是id,uname id是主键,也是索引的一部分 所以select * 取的两个字段都是索引字段。所以 like 语句都会使用到索引。
后面加了一个非索引字段status,并且取数据列表里也存在status字段,所以%在匹配值前的情况就会受影响。
当然如果不是select * ,而是select id 或者select uname 再或者 select id,uname 都会使用上索引。

mysql fulltext相关推荐

  1. mysql fulltext 分页_关于MySQL的FULLTEXT实现全文检索的注意事项

    对于英文,MySQL的FULLTEXT属性来实现全文检索是相当方便且高效的,但是在使用过程中需要注意一些事项. 首先对我们对需要进行检索的字段添加FULLTEXT属性(假设已经建表): SQL: al ...

  2. mysql fulltext类型_mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的详细介绍(转)

    Normal 普通索引 表示普通索引,大多数情况下都可以使用 Unique 唯一索引 表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique 约束唯一标识 ...

  3. mysql fulltext match_使用Mysql全文搜索Full-Text(fulltext和match...against)_MySQL

    bitsCN.com 作者:aolinks 一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行, 但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候. ---- ...

  4. MySQL FULLTEXT全文索引

    一.FULLTEXT简介 MySQL具备全文搜索的能力,它可以让你在不使用模板匹配操作的情况下进行单词或短语的查找. 全文搜索有3种类型: 自然语言搜索(默认类型).MySQL会把搜索字符串解析成一系 ...

  5. mysql fulltext innodb_InnoDB FULLTEXT

    1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...

  6. mysql fulltext搜索_mysql 全文搜索 FULLTEXT

    到 3.23.23 时,MySQL 开始支持全文索引和搜索.全文索引在 MySQL 中是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE ...

  7. mysql fulltext like_MySQL全文索引 FULLTEXT索引和like的区别

    1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...

  8. mysql 索引 fulltext,MySQL FULLTEXT索引问题

    I'm trying to create a FULLTEXT index on an attribute of a table. Mysql returns ERROR 1214: The used ...

  9. mysql fulltext 不起作用_MySQL FULLTEXT不工作

    我正在尝试使用MySQL的FULLTEXT索引添加对我的PHP Web应用程序的搜索支持. 我创建了一个测试表(使用MyISAM类型,单个文本字段a)并输入了一些示例数据.现在如果我是正确的,以下查询 ...

最新文章

  1. 防止在iOS设备中的Safari将数字识别为电话号码
  2. adb logcat read: unexpected EOF!
  3. post postman 传值_postman参数传递
  4. 用SQL进行嵌套查询
  5. 这个Javascript“要求”是什么?
  6. mysql 范围索引 els_MySQL 复习笔记
  7. win10下Cmake(make-gui)下载与安装【详细】
  8. Python程序设计
  9. 小米手机TCP连接一些奇怪现象
  10. 浏览器和服务器的区别
  11. 将UTC日期字符串转为本地时间字符串,如@yyyy-MM-dd'T'HH:mm:ssZ转换为本地时间
  12. 2021Java面经:最便宜java培训机构
  13. SQL Server 配置管理器中Browser灰色无法启动解决办法
  14. 常用的自动化管理工具
  15. 细节!从solar winds黑客入侵事件中看供应链安全
  16. 小米官网前端页面还原
  17. 银河麒麟V10系统 syslog和kern.log文件过大问题解决,定时清理日志文件
  18. 你知道互联网行业哪些岗位需求量最大?什么职位最赚钱?
  19. 程序员必须掌握的英文单词(二)
  20. 安装工程造价课程设计_工程造价课程设计

热门文章

  1. delphi 自定义popupmenu_Delphi PopupMenu
  2. linux top根据cpu/内存排序
  3. 关于电路的输入阻抗和输出阻抗
  4. 微信开发弹窗四种方法
  5. 甲骨文与富士通利用SPARC架构打造M12超级设备
  6. Centos 防火墙命令
  7. js获取url参数中文乱码问题
  8. (转载) 如何利用github打造博客专属域名
  9. 博恩·崔西的时间法则
  10. 访问服务器登录域怎么修改,更改域服务器ip地址 dns怎么更改