一) 前期准备测试:
-
旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。
-
不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网,下载mySql5.7
-
直接使用,可检索数字,英文,测时检索中文失败
alter table testtable add fulltext index testfulltext(clumn1,clumn2)`
-
解决无法查询中文,修改配置文件my.ini [mysqld] ngramtokensize=2
加入全文索引
-
建表同时加入全文检索
CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT,FULLTEXT (title,body) WITH PARSER ngram ) ENGINE=InnoDB CHARACTER SET utf8mb4;
-
修改方式添加全文检索
alter table testtable add fulltext index testfulltext(clumn1,clumn2) with parser ngram;
-
新建方式添加全文检索
CREATE FULLTEXT INDEX ft_email_name ON student(name) with parser ngram;`
-
验证全文检索结果
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('关键词' IN NATURAL LANGUAGE MODE);
注意:关键字不能太短,小于两个字无法匹配> 注意:关键字不能太短,小于两个字无法匹配
二) 2000W数据实测:
数据库已经建好,数据已经插入,总数据量为1980W条数据
-
添加全文检索:
CREATE FULLTEXT INDEX ft_pat_search ON pat_patent(`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) with parser ngram;
-
查询:
SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE);
结果用时183s,耗时太长 分析原因1:索引量过大导致过慢,尝试缩短检索字段(只选用一个字段)
CREATE FULLTEXT INDEX ft_pat_search_ti ON pat_patent(`ti`) with parser ngram;
结果可明显提升检索速率,检索用时1.3s; 依旧不理想,继续分析原因,可能是查询结果数据量过大,传输受限,尝试加入分页
SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE) LIMIT 10, 10;
查询结果0.5s,测试成功
三)总结:
- 版本更新至5.7,注意数据库路径选择在非C盘,负责会在添加全文检索时报错ERRO:1878
- 添加检索式加上 with parser ngram
- 配置文件加上ngramtokensize=2,可解决搜索中文问题
- 提高查询效率,可加入分页