概述
本文主要介绍RDS MySQL全文检索相关问题及处理方法。
阿里云提醒您:
本文通过如下几个方面介绍全文检索:
RDS MySQL对全文检索的支持
RDS MySQL 5.5版本仅MyISAM引擎表支持全文索引,RDS MySQL 5.6版本MyISAM和InnoDB引擎都支持全文索引。
RDS MySQL全文检索相关参数
参考如下SQL语句,可以查看相关参数。
show global variables like 'ft_%';
show global variables like 'innodb_ft%';
需要在RDS控制台参数设置页面中设置下列参数。
ft_min_word_len MyISAM引擎表全文索引包含的最小词长度。 ft_query_expansion_limit MyISAM引擎表使用
with query expansion
进行全文搜索的最大匹配数。
innodb_ft_min_token_size
InnoDB引擎表全文索引包含的最小词长度。
innodb_ft_max_token_size
InnoDB引擎表全文索引包含的最大词长度。
RDS MySQL对中文全文检索的支持
MyISAM引擎表和InnoDB引擎表(RDS MySQL 5.6版本)都支持中文全文检索。
MyISAM引擎表
MyISAM引擎表需要将ft_min_word_len设置为小于等于需要检索的最小分词长度,设置完毕后建议重新创建表上已有的全文索引。对于中文检索,建议将ft_min_word_len设置为1,否则可能出现查不到数据的情况,如下图所示。
重建全文索引示例
表结构如下所示。
CREATE TABLE `my_ft_test_02` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_ft_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
重建全文索引步骤。
alter table my_ft_test_02 drop key idx_ft_name;
alter table my_ft_test_02 add fulltext key idx_ft_name (name);
InnoDB引擎表
InnoDB引擎表需要将innodb_ft_min_token_size设置为小于等于需要检索的最小分词长度,设置完毕后建议重新创建表上已有的全文索引,对于中文检索,建议将innodb_ft_min_token_size设置为1,否则可能出现查不到数据的情况,如下图所示。
重建全文索引示例
表结构如下所示。
CREATE TABLE `my_ft_test_01` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_ft_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
重建全文索引步骤。
alter table my_ft_test_01 drop key idx_ft_name;
alter table my_ft_test_01 add fulltext key idx_ft_name (name);
like语句和全文检索的比较
like语句
对于数据量比较小,查询条件无法分词的情况下,可以考虑使用like来进行查询,如下图所示。但是由于like这样的条件无法使用字段上的索引,因此通常执行时间较长,会耗费比较多的资源。建议结合查询其他条件来使用,这样可以尽量使用其他字段的索引来加速查询。
全文检索本身是按词进行匹配,因此返回的结果会和like的方式有所区别,如下图所示。
ft_query_expansion_limit参数作用
MySQL全文检索支持扩展检索,具体请参考
带查询扩展的全文检索
。ft_query_expansion_limit参数的作用是指定MyISAM引擎表使用
with query expansion
进行全文搜索的最大匹配数,下面以一个例子来说明其作用。
show global variables like 'ft_qu%';系统显示类似如下。
![](https://onekb.oss-cn-zhangjiakou.aliyuncs.com/50855018/822e4f70-c658-49b5-865c-05b7c042c7a3.png)
select * from my_ft_test_01 where id >= 117;系统显示类似如下,good和Hello都出现20次。
![](https://onekb.oss-cn-zhangjiakou.aliyuncs.com/50855018/bb6f545d-5ec2-422d-b2e5-7e39187b264c.png)
select * from my_ft_test_01 where math(name) AGAINST ('孙悟空' with query expansion);系统显示类似如下,返回结果中包含good。
![](https://onekb.oss-cn-zhangjiakou.aliyuncs.com/50855018/320bb06b-83f6-4dc1-9108-dedaa88956b6.png)
针对RDS MySQL 5.7与RDS MySQL 5.6中全文检索字符个数不同的说明
RDS MySQL 5.6中支持的字符个数存在Bug,RDS MySQL 5.7中官方进行了修复,限制为32个。
- 本页导读 (1)