mysql全文索引 版本_mysql 全文索引

全文索引的格式:

MATCH (columnName) AGAINST ('string')

例如:

SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪')--当查询多列数据时:--建议在此多列数据上创建一个联合的全文索引,否则使用不了索引的。

SELECT * FROM `student` WHERE MATCH(`name`,`address`) AGAINST('聪 广东')

概念

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

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

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

版本支持

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

MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;

MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;

只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

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

操作全文索引

1. 创建

1.1 创建表时创建全文索引

create tablefulltext_test (

idint(11) NOT NULLAUTO_INCREMENT,

contenttext NOT NULL,

tagvarchar(255),PRIMARY KEY(id),

FULLTEXTKEY content_tag_fulltext(content,tag) --创建联合全文索引列

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

create fulltext indexcontent_tag_fulltexton fulltext_test(content,tag);

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

alter tablefulltext_testadd fulltext index content_tag_fulltext(content,tag);

2. 删除全文索引

2.1. 直接使用 drop index(注意:没有 drop fulltext index 这种用法)

DROP INDEX full_idx_name ON tommy.girl ;

2.2. 使用 alter table的方式

ALTER TABLE tommy.girl DROP INDEX ft_email_abcd;

使用全文索引

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

select * fromfulltext_testwhere match(content,tag) against('xxx xxx');

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

测试全文索引

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

create tabletest (

idint(11) unsigned not nullauto_increment,

contenttext not null,primary key(id),

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

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。

参考链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值