RDS MySQL 5.5 仅 MyISAM 引擎表支持全文索引,RDS MySQL 5.6 版本 MyISAM 和 InnoDB 引擎都支持全文索引。
可以在控制台
参数设置来设置下列参数。
# | 参数名称 | 默认值 | 最小值 | 最大值 | 作用 |
1 | ft_min_word_len | 4 | 1 | 3600 | MyISAM 引擎表全文索引包含的最小词长度 |
2 | ft_query_expansion_limit | 20 | 0 | 1000 | MyISAM引擎表使用 with query expansion 进行全文搜索的最大匹配数 |
3 | innodb_ft_min_token_size | 3 | 0 | 16 | InnoDB 引擎表全文索引包含的最小词长度 |
4 | innodb_ft_max_token_size | 84 | 10 | 84 | InnoDB 引擎表全文索引包含的最大词长度 |
show global variables like 'ft_%'; --查看 MyISAM 引擎表全文检索相关参数show global variables like 'innodb_ft%'; --查看 InnoDB 引擎表全文检索相关参数
MyISAM 引擎表和 InnoDB 引擎表(需 RDS MySQL 5.6 版本)都支持中文全文检索。
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_ft_min_token_size 设置为小于等于需要检索的最小分词长度,设置完毕后建议重新创建表上已有的全文索引;对于中文检索,建议将 ft_min_word_len 设置为 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 ‘%xxx%’ 来进行查询。但是由于 like ‘%xxx%’ 这样的条件无法使用字段上的索引,因此通常执行时间较长,会耗费比较多的资源;建议结合查询其他条件来使用,这样可以尽量使用其他字段的索引来加速查询。
全文检索本身是按
词 进行匹配,因此
返回的结果会和 like ‘%xxx%’ 的方式有所区别。
MySQL 全文检索支持扩展检索,具体请参考
带查询扩展的全文检索
参数 ft_query_expansion_limit 的作用是指定MyISAM引擎表使用with query expansion进行全文搜索的最大匹配数,下面以一个例子来说明其作用。
参数 ft_query_expansion_limit 当前设置为 20:
当前表中相关的记录情况:
使用查询扩展的结果:
One thought on "RDS MySQL 全文检索相关问题的处理"
Thank you very much for the information, it helped me make the right choice.