当前位置:首页 >> 中医美容 >> like模糊匹配查询较慢解决之道——MySQL全文索

like模糊匹配查询较慢解决之道——MySQL全文索

发布时间:2023-04-29

(id, uid, word, translate) VALUES (7, 'fba5861d9527440990276e999f47ef8f', 'buffalo', '的水牛');INSERT INTO t_word (id, uid, word, translate) VALUES (8, '3a72e76f210841b1939fff0d3d721375', 'bull', '公牛');INSERT INTO t_word (id, uid, word, translate) VALUES (9, '272e0b28ea7a48248a86f17533bf9943', 'cow', '一头');INSERT INTO t_word (id, uid, word, translate) VALUES (10, '47127adface54e418e4c1b9980af6d16', 'calf', '小牛');INSERT INTO t_word (id, uid, word, translate) VALUES (11, '10592499c65648b0a9519206688ef3f9', 'little lion', '小雄狮');INSERT INTO t_word (id, uid, word, translate) VALUES (12, '1bf095110b634a01bee5b31c5ee7ee0c', 'little cow', '一头');INSERT INTO t_word (id, uid, word, translate) VALUES (13, '4813e588cde54c30bd65bfdbb243ad1f', 'little calf', '小小牛');INSERT INTO t_word (id, uid, word, translate) VALUES (14, '5e377e281ad344048b6938a638b78ccb', 'little bull', '小公牛');INSERT INTO t_word (id, uid, word, translate) VALUES (15, '2855ad0da2964c7682c178eb8271f13d', 'little buffalo', '小的水牛');INSERT INTO t_word (id, uid, word, translate) VALUES (16, '72f24c9a77644d57a36f3bdf2b8116b0', 'little lamb', '小牲口');INSERT INTO t_word (id, uid, word, translate) VALUES (17, '2d592499c65648b0a9519206688ef3f9', 'I''m a big lion', '我是一只大雄狮');副本编译器

3、删除全文资料库

alter table 表名 drop index 资料库名;

4、全文资料库可用

构词

MATCH(col1,col2,...) AGAINST(expr[search_modifier])search_modifier:{ IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN boolean MODE | WITH QUERY EXPANSION}副本编译器

4.1 IN NATURAL LANGUAGE MODE

文法手段在是MySQL 配置PDF 的全文集成手段在。文法手段在不能可用操作符,不能而无须关键用语只能浮现或者只能不能浮现等精细坎看。

// 配置PDF是可用 in natural language modeselect * from t_word where match(word) against ('lion');// 或者 标示显露写select * from t_word where match(word) against ('lion' in natural language mode);副本编译器

结果如下:

4.2 IN BOOLEAN MODE

BOOLEAN手段在可以可用操作符,可以支持而无须关键用语只能浮现或者只能不能浮现或者关键用语的权重很低还是低等精细坎看。推荐可用boolean手段在

启动时

描述

为空

配置PDF,涵盖该用语

+

最主要,这个用语只能存在。

-

排除,用语不得浮现。

>(大于号)

最主要,并提很低位列取值,坎看的结果会靠此前

最主要,并增高位列取值,坎看的结果会靠后

()

将后缀分组为子参数(允许将它们作为一组最主要在内,排除在外,位列等等)。

论证后缀的位列取值。

*

通配符在这个用语的结尾。

“”

界定字词(与单个后缀列表相对,整个字词也就是说以涵盖或排除)。

示例:

// 坎看显露涵盖 lion、cow的详细描述select * from t_word where match(word) against ('lion cow' in boolean mode);副本编译器 // 排除涵盖lion详细描述、坎看显露涵盖cow或者little的详细描述,增加涵盖calf后缀的位列,增高涵盖cow详细描述的位列,坎看显露以go开头的详细描述select * from t_word where match(word) against ('-lion cow little>calf 好像解决办法都解决了, 但是解决办法才本来

回到最开始的才可求,我一切都是模糊坎看

select * from t_word where match(word) against('lio' in boolean mode);副本编译器

考虑到取值:把涵盖lion的都坎看显露来 也就是说结果:啥都无法。

全也就是说坎看的时候能坎看显露来

select * from t_word where match(translate) against('小的水牛' in boolean mode);副本编译器

只坎看部分坎看不显露来。如:示意图只坎看 "小的水" 或者"的水牛" 都无法资料

select * from t_word where match(translate) against('小的水' in boolean mode);副本编译器

奇怪了,这咋没显露来呢?

全文资料库配置PDF是只按照空格顺利完成分用语的,所以当我完整的单个后缀去坎看的时候是能坎显露来的。但是可用部分后缀去坎看或者可用部分之前文去坎看时,是坎看不显露来资料的,像之前文并不才可要可用之前文分用语器顺利完成分用语。

之前文分用语与全文资料库

InnoDB配置PDF的全文资料库parser相当合适于Latin,因为Latin是通过空格来分用语的。但对于像之前文,日文和朝鲜语来说,无法这样的分隔符。一个用语可以由多个字来都是由,所以我们并不才可要用不同的手段来处理。在MySQL 5.7.6之前我们能可用一个属于自己全文资料库插件来处理它们:n-gram parser。

什么是N-gram?

在全文资料库之前,n-gram就是一段文本里面面周内的n个字的序列。例如,用n-gram来对“飞轮序文动”来顺利完成分用语,给予的结果如下:

N=1 : '齿', '轮', '序文', '动';N=2 : '飞轮', '轮序文', '序文动';N=3 : '飞轮序文', '轮序文动';N=4 : '飞轮序文动';副本编译器这个上面这个N是怎么去配置的?坎一下目此前的取值show variables like '%token%';副本编译器

常量解析:

innodb_ft_min_token_size 配置PDF3,声称最小3码字作为一个关键用语,增加该取值可下降全文资料库的大小不一 innodb_ft_max_token_size配置PDF84,声称最大者84码字作为一个关键用语,允许该取值可下降全文资料库的大小不一ngram_token_size配置PDF2,声称2码字作为内置分用语JavaScript的一个关键用语,有权取取值范围是1-10,如对“abcd”组织起来全文资料库,关键用语为’ab’,‘bc’,‘cd’ 当可用ngram分用语JavaScript时,innodb_ft_min_token_size和innodb_ft_max_token_size 无效

修正手段

手段1: 在my.cnf之前修正/加进常量

[mysqld]ngram_token_size = 1 副本编译器

手段2: 修正启动常量

mysqld --ngram_token_size=1副本编译器

常量均不能不动态修正,修正后才可重启MySQL免费,并重新组织起来全文资料库

也就是说可用初始化测试资料

这里面只缺少部分测试资料,我示意图sql可用全量资料,资料对不上

create table t_chinese_phrase( id int unsigned auto_increment comment 'id' primary key, phrase varchar(32) not null comment '用语组') collate = utf8mb4_general_ci;INSERT INTO t_chinese_phrase (id, phrase) VALUES (278911, '阿荣族');INSERT INTO t_chinese_phrase (id, phrase) VALUES (279253, '上海浦东南荣起义');INSERT INTO t_chinese_phrase (id, phrase) VALUES (282316, '天和');INSERT INTO t_chinese_phrase (id, phrase) VALUES (282317, '荣盛');INSERT INTO t_chinese_phrase (id, phrase) VALUES (282318, '荣言');INSERT INTO t_chinese_phrase (id, phrase) VALUES (286534, '东荣纸板');INSERT INTO t_chinese_phrase (id, phrase) VALUES (291525, '海荣蓝');INSERT INTO test.t_chinese_phrase (id, phrase) VALUES (346682, '繁盛荣盛');INSERT INTO test.t_chinese_phrase (id, phrase) VALUES (282317, '荣盛');INSERT INTO test.t_chinese_phrase (id, phrase) VALUES (287738, '繁盛');INSERT INTO test.t_chinese_phrase (id, phrase) VALUES (287736, '繁盛');副本编译器加进资料库

mysql 全文资料库可用倒排资料库为 full inverted index 结构:{后缀,(后缀所在文档的ID,后缀在实际PDF之前的一段距离)}

加进资料库:

alter table t_chinese_phrase add fulltext ful_phrase (phrase) with parser ngram;副本编译器

建完资料库,我们可以通过坎看INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE和INFORMATION_SCHEMA.INNODB_FT_TABLE_TABLE来坎看哪些用语在全文资料库里面面。这是一个相当有用的仿真应用软件。如果我们发现一个涵盖某个用语的文档,无法如我们所期望的那样浮现在坎看结果之前,那么这个用语可能是因为某些缘故不在全文资料库里面面。比如,它带有stopword,或者它的大小不一小于ngram_token_size等等。这个时候我们就可以通过坎看这两个表来核实。示意图是一个简单的案例:

# test: 库名 t_chinese_phrase: 表名字SET GLOBAL innodb_ft_aux_table="test/t_chinese_phrase";# 坎看分用语可能会SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;# 坎看分用语可能会select * from information_schema.innodb_ft_index_table;副本编译器

坎看结果如下:

因为我们上面设了分用语数是1,所以,可以看着都是按照一个用语顺利完成分用语的。

队列解析:FIRST_DOC_ID :word第一次浮现的文档ID LAST_DOC_ID : word最后一次浮现的文档IDDOC_COUNT :带有word的文档个数DOC_ID :当此前文档IDPOSITION : word 当在此前文档ID的一段距离

坎看1、可用文法手段在 NATURAL LANGUAGE MODE 坎看

在文法手段在(NATURAL LANGUAGE MODE)下,文本的坎看被类比为n-gram分用语坎看的并集。

例如,当ngram_token_size = 1 时,(‘繁盛荣盛’)类比为(‘繁 荣 荣 盛’)。示意图一个案例:

SELECT * FROM t_chinese_phrase WHERE MATCH (phrase) AGAINST ('繁盛荣盛' in natural language mode) ;副本编译器 2、可用尼瓦手段在(BOOLEAN MODE)坎看

尼瓦手段在(BOOLEAN MODE)文本坎看被转化为n-gram分用语的字词坎看

例如,当ngram_token_size = 1 时,(‘繁盛荣盛’)类比为(‘”繁盛荣盛“’)。示意图一个案例:

SELECT * FROM t_chinese_phrase WHERE MATCH (phrase) AGAINST ('繁盛荣盛' in boolean mode) ;副本编译器 也就是说可用

回到我们最开始的坎看才可求,看看也就是说的效用

坎看涵盖了“荣”的资料

SELECT * FROM t_chinese_phrase WHERE MATCH (phrase) AGAINST ('荣' IN boolean MODE) ;SELECT * FROM t_chinese_phrase WHERE MATCH (phrase) AGAINST ('荣' ) order by id asc;副本编译器

可以看着结果:目此前“荣”在任意一段距离都能被坎看着。

坎看监督计划如下:

工期31ms(不丢下资料库是90ms),工期差不多是之此前的1/3。

肯定点

1、文法全文资料库始创资料库时的队列才可与坎看的队列相一致,即MATCH里面的队列只能和FULLTEXT里面的一模一样;

2、文法集成时,集成的codice_在所有资料之前不能超过50%(即常见用语),则不会集成显露结果。可以通过尼瓦集成坎看;

3、在mysql的stopword之前的后缀集成不显露结果。可通过

SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD副本编译器

坎看所有的stopword。遇到这种可能会,有两种解决办法:

(1)stopword一般是mysql自建的,但可以通过设ft_stopword_file变量为插件PDF,从而自己设stopword,设完成后并不才可要重新始创资料库。但不建议可用这种分析方法;

(2)可用尼瓦资料库坎看。

4、小于最短间距和大于最长间距的关键用语无法坎显露结果。可以通过设完全相同的变量来改变间距允许,修正后并不才可要重新始创资料库。

myisam涡轮引擎下完全相同的变量取名为ft_min_word_len和ft_max_word_len

innodb涡轮引擎下完全相同的变量取名为innodb_ft_min_token_size和innodb_ft_max_token_size

5、MySQL5.7.6之此前的版本不支持之前文,才可可用第三方插件

6、全文资料库只能在 InnoDB(MySQL 5.6以后) 或 MyISAM 的表上可用,并且只能用作始创 char,varchar,text 类型的列。

译文链接:

纤维素
多维元素片怎么吃
消化不良想吐怎么办除了用药,饮食要注意哪些
新冠XBB.1.16
长期便秘是什么原因
标签:
友情链接: