mysql中文全文检索从入门到放弃
like全匹配模糊查询不能使用索引一直是sql查询的一个棘手的问题,那么mysql的全文检索真的能解决这个问题吗?
背景
最近,在工作中遇到一个查询优化的问题,简化的sql如下:
SELECT*
FROMwxswj_nsrxx
WHEREnsrmc LIKE '%东鹏%' OR nsrsbh LIKE '%东鹏%' OR shxydm LIKE '%东鹏%';
问题:
1、采用了全匹配模糊查询
2、使用了OR关键字
很明显这样的查询是不能走索引,而由于表的数据量非常大,有500多万数据,导致整个查询的响应速度非常不理想。
中文全文检索实战
ngram分词插使用说明:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html添加链接描述
1、优化思路:
中文模糊匹配查询,主要涉及到分词和全文检索,而mysql里面有一种索引类型就是全文索引FULLTEXT。所以想通过全文索引来解决mysql中全匹配模糊查询的问题。
2、说明:
在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文分词。
3、查看当前数据库版本:
select version() from dual;
结果为5.7.28,支持中文全文检索
4、全文检索限制:
FULLTEXT indexes are created on text-based columns (CHAR, VARCHAR, or TEXT columns)
全文索引只能被创建在CHAR, VARCHAR, or TEXT的字段上。
每张表只能有一个全文检索的索引
由多列组合而成的全文检索的索引必须使用相同的字符集与排序规则
5、关闭查询缓存
sql优化前,一般会关闭查询缓存:
SHOW VARIABLES LIKE ‘query_cache%’;
set global query_cache_size=0;
set global query_cache_type=0;
SHOW VARIABLES LIKE ‘query_cache%’;
6、建立全文索引
ALTER TABLE `wxswj`.`wxswj_nsrxx` ADD FULLTEXT INDEX `ft_index`(`nsrmc`,`nsrsbh`,`shxydm`) WITH PARSER ngram;
7、使用全文索引
通过**MATCH (col1,col2,…) AGAINST (expr [search_modifier])**语句,使用全文索引。
SELECT*
FROMwxswj_nsrxx MATCH ( `nsrmc`, `nsrsbh`, `shxydm` ) against ( '东鹏' IN boolean MODE )
这里使用东鹏
去模糊匹配nsrmc
, nsrsbh
, shxydm
这三个字段,任意一个字段中包含查询关键字东鹏
就返回对应记录。
8、查询执行计划
使用了新建的组合全文检索,ref达到const级别
9、优化效果
查询性能提升了100多倍。
坑
目前为止,好像一切都非常美好,但很快坑就出现了。
当查询的关键词太长,就出现了异常?
问题一:FTS query exceeds result cache limit
当采用比较长的查询条件去匹配执行查询或甚至执行查询计划时,出现异常:
188 - FTS query exceeds result cache limit
mysql官网中对该异常的解释说明:
https://bugs.mysql.com/bug.php?id=86036
每个全文搜索查询或每个线程的InnoDB全文搜索都对查询结果进行了缓存限制,以字节为单位定义。中间和最终的InnoDB全文搜索查询结果在内存中处理。可以使用innodb_ft_result_cache_limit设置大小限制。全文搜索查询结果缓存可避免InnoDB全文搜索查询结果非常大(例如,数百万或数亿行)时过多的内存消耗。 如果达到结果缓存大小限制,则返回错误,指示查询超出了最大允许的内存。
推荐解决办法:
1、增加innodb_ft_result_cache_limit的值,使其大于4G
SHOW VARIABLES LIKE 'innodb_ft_result_cache_limit%';
set global innodb_ft_result_cache_limit=4000000000;
2、优化查询语句,限制查询返回的记录条数,减少来自中间结果的巨大缓存。一般通过显示指定limit来限制。
问题二:查询速度非常不稳定
我们通过修改innodb_ft_result_cache_limit的值,解决了缓存限制的异常问题。
当时,我们尝试修改查询条件时,发现查询性能非常不稳定。
有时候查询速度非常快,有时候甚至比不上like全匹配模块查询。
特别是当查询条件非常长的时候,问题非常明显,查询性能完全没有保证。
SELECT*
FROMwxswj_nsrxx MATCH ( `nsrmc`, `nsrsbh`, `shxydm` ) against ( '中国航天工业科学技术咨询有限公司' IN boolean MODE )
放弃
通过调研各种资料,没有找到比较好解决方案,最后还是无奈选择放弃。
测试语句
create table test(
id int(11) not null primary key auto_increment,
name varchar(100) not null comment '工商名',
brand varchar(100) default null comment '品牌名',
en varchar(100) default null comment '英文名',
fulltext key (name,brand,en) with parser ngram
)engine=innodb default charset=utf8;
insert into test (name,brand,en) values ('芜湖美的厨卫电气制造有限公司','aa','wh');
insert into test (name,brand,en) values ('北京凡客尚品电子商务有限公司','aa','ef');
insert into test (name,brand,en) values ('凡客诚品(北京)科技有限公司','aa','dfd');
insert into test (name,brand,en) values ('瞬联讯通科技(北京)有限公司','aa','sdfs');
insert into test (name,brand,en) values ('北京畅捷通讯有限公司','aa','wsdh');
insert into test (name,brand,en) values ('北京畅捷通支付技术有限公司','aa','df');
insert into test (name,brand,en) values ('畅捷通信息技术股份有限公司','aa','whdfgh');
insert into test (name,brand,en) values ('北京畅捷科技有限公司','aa','dgdf');
insert into test (name,brand,en) values ('中国航天工业科学技术咨询有限公司','aa','whffgh');
insert into test (name,brand,en) values ('北京·松下彩色显象管有限公司','aa','wfghfgh');
insert into test(name,brand,en) select name,brand,en from test;
insert into test(name,brand,en) select name,brand,en from test;
insert into test(name,brand,en) select name,brand,en from test;
insert into test(name,brand,en) select name,brand,en from test;
insert into test(name,brand,en) select name,brand,en from test;
insert into test(name,brand,en) select name,brand,en from test;EXPLAIN SELECT * from test where match (name,brand,en) against ('通讯录' IN BOOLEAN MODE) LIMIT 100;
创建的测试数据总数据量为:655360
select count(*) from test;
SELECT * from test where name like '%美的%' or brand like '%美的%' or en like '%美的%';
耗时:0.544EXPLAIN SELECT * from test where match (name,brand,en) against ('美的' IN BOOLEAN MODE) LIMIT 100;
耗时:0.150SELECT * from test where name like '%芜湖美的厨卫电气制造有限公司%' or brand like '%芜湖美的厨卫电气制造有限公司%' or en like '%芜湖美的厨卫电气制造有限公司%';
耗时:0.679EXPLAIN SELECT * from test where match (name,brand,en) against ('芜湖美的厨卫电气制造有限公司' IN BOOLEAN MODE) LIMIT 100;
耗时:5.626
通过加双引号,实现确切短语搜索,不对搜索条件进行分词匹配,我们测试下:
SELECT * from test where match (name,brand,en) against ('"芜湖美的厨卫电气制造有限公司"' IN BOOLEAN MODE) LIMIT 100;
耗时:5.626
发现对查询性能没有影响。
通过实验发现,当查询条件越长,查询性能越慢。
大家可以自己测试感受一下。
有关于mysql全文检索使用好的建议,欢迎分享。
结论
本次实验证明,mysql对全文检索的支持有限,限制比较大,查询性能也得不到保证,很多时候可能比不上直接使用like查询。
几十万数据的小表,可以考虑玩一下。
对一些大表需要全匹配模糊查询时,首先是和业务方商量是否可以只支持前匹配模糊查询,其次尽可能增加其他查询条件,另外通过limit限制匹配的记录数。
复杂查询下,并且一定要求对全匹配模糊查询支持且对查询性能有严格要求,那么推荐使用Elasticsearch。
关注私聊我,免费领取视频教程。
更多精彩,关注我吧。
mysql中文全文检索从入门到放弃相关推荐
- MySQL中文全文检索
一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 1 2 MATCH (col1,col2,...) AGAINST (exp ...
- MySQL中文全文检索demoSQL
一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAI ...
- mysql5.7中文全文检索,让MySQL支持中文全文检索
因为中文词间并没有明显的区隔,所以中文的分词是按照字典.词库的匹配和词的频度统计,或是基于句法.语法分析的分词,而MySQL并不具备此功能,所以MySQL对中文全文检索的支持几乎为零. 目前很多网站和 ...
- mysql sphinx windows安装_Sphinx在windows下安装使用[支持中文全文检索]
前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在 linux环境下的安装使用,当然,作为生产环境很有必要部署在 ...
- php mysql 全文检索_MySQL中文全文检索
一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAINST (expr [s ...
- mysql 分库分表中间件 mycat_阿里开源的分布式分库分表中间件之MyCat从入门到放弃...
原标题:阿里开源的分布式分库分表中间件之MyCat从入门到放弃 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybi ...
- 钓鱼邮件从入门到放弃
目录 钓鱼邮件从入门到放弃 一.钓鱼邮件的基本概念 1.1 钓鱼邮件的伪造方式 1.1.1 购买域名搭建邮箱服务器 1.1.2 伪造发件人 1.2 三个邮件安全协议 1.2.1 SPF 1.2.2 D ...
- Power Apps从入门到放弃教程
Power Apps从入门到放弃教程 前言 啥是Power apps 文档资料 官方文档 官方公式文档 官方控件文档 案例实操 添加数据源 用户登录 登录成功,跳转主界面 添加组件 提示语言 流 前言 ...
- 使用Whoosh构建自己的搜索引擎、whoosh和jieba实现中文全文检索
whoosh 是一个纯python实现的全文搜索引擎,它小巧轻便,安装简单,设计上参考了 Lucene ,性能上虽有欠缺,但贵在方便,无需复杂安装,对于构建小型网站的搜索引擎来说,是一个不错的选择.1 ...
最新文章
- 腾讯SNG举办TSAIC大会,学术和工业界共话AI前沿趋势
- ubuntu14.04 server安装vncserver
- python如何使用字典_python字典怎么使用zip
- mysql——decimal类型与decimal长度
- 升级到Oracle 19c:你不可不知的十大SQL问题(上)
- (转载)python re模块详解 正则表达式
- android pdf阅读开发
- ONMF正交非负矩阵分解·论文总结
- 权威大数据应用解决方案
- Big Faceless:PDF Viewer for JAVA Crack
- Linux文件解hgc,Linux从实模式到保护模式.pdf
- Python鼠标连续点击事件
- Redis CRC16校验 1.原理概述
- 最好用的设计稿实时预览工具【Sketch、Android App、iOS App】
- bat批处理删除文件
- 教育邮箱白嫖office365
- 中国智能全轮驱动系统行业市场供需与战略研究报告
- 软考--流水线问题吞吐率详解
- 解决网通iNode 智能客户端共享上网问题
- 虚拟机软件(VMware)的下载与安装