聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧!
(PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~)
一、需求起源
(某天,端着水杯的老胡路过时看见小帅在电脑前噼里啪啦折腾键盘。。。)
老胡:“小帅你干啥呢,怎么跟键盘过不去?”
小帅:“别提了,刚才行一的人让我从这堆数据里找出包含xxx的东西,完了后行二的人也找过来说给她找出xxx的东西,下班前给到,眼都花了。。。诶我的Control+F键怎么就不好使了。。。”
老胡:“。。。”
江华:“。。。差点当场QS,亏你还说自己是个程序员!”
老胡:“小帅,你这样可不行,明天行三,后天行四的人过来找你要数据,换三个键盘也搞不定啊。为啥不做个查找小功能,让行服的人要什么数据就查什么呢。”
小帅:“诶对哦,昨天从tony老师那里学了sql,好像里面就有个like模糊查找,我马上做一个!”
二、最初的设计
(小帅想了下,可以做个简单的前端界面,作为用户,然后发送请求到后端,后端拼接成sql语句,从db里查出数据,然后返回json数据给前端展示。)
主要技能点
1、利用脚手架快速搭建java工程
《搭建大型分布式服务(十八)Maven自定义项目脚手架》
2、测试环境搭建数据,并导入数据
《搭建大型分布式服务(四)Docker搭建开发环境安装Mysql》
3、使用mybatis作为orm框架,并使用高速数据库连接池hikari
《搭建大型分布式服务(五)Springboot整合mybatis》
《搭建大型分布式服务(六)SpringBoot整合数据库连接池hikari》
核心原理
利用SQL的like语法,拼上前端请求的keyword,在数据库上执行
select * from t_product where title like '%keyword%'
(于是乎,小帅一顿乱敲,搜索系统1.0 like版本出来了)
小帅:“哈哈哈,搞掂收工!终于不用换键盘啦,还是like给力!要查什么东西,让行服的人自个儿查去,我去接小檬下班啦!”
老胡:“。。。”(一副看傻子的表情)
江华:“。。。”(一副看傻子的表情)
三、新的麻烦
(可是,好景不长,当数据增长到几十万后,行服输入关键字后,等半天都没结果返回。。。)
小帅:“老胡老胡,江湖救急,这sql语句执行太慢了,前端所有请求都超时了,再不解决行服的人都要提刀过来啦!”
老胡:“别急,当数据增长到一定程度的时候,传统like语句容易出现性能瓶颈,这是正常现象。”
小帅:“那怎么办呢?”
江华:“都不知道你脑子整天想啥,前天讲sql的时候,tony不是说到全文索引嘛,换下试试?”
小帅:“哦哦,对哦,我马上改改!”
江华:“别忘了配置最小搜索长度。”
小帅:“好的,知道的!”
四、全文索引
MySQL has support for full-text indexing and searching:
A full-text index in MySQL is an index of type FULLTEXT.
Full-text indexes can be used only with InnoDB or MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.
MySQL provides a built-in full-text ngram parser that supports Chinese, Japanese, and Korean (CJK), and an installable MeCab
full-text parser plugin for Japanese. Parsing differences are outlined
in Section 12.10.8, “ngram Full-Text Parser”, and Section 12.10.9,
“MeCab Full-Text Parser Plugin”.A FULLTEXT index definition can be given in the CREATE TABLE statement when a table is created, or added later using ALTER TABLE or
CREATE INDEX.For large data sets, it is much faster to load your data into a table that has no FULLTEXT index and then create the index after that,
than to load data into a table that has an existing FULLTEXT index.
小帅利用mysql支持全文索引的特性,快速做了以下修改。
1、修改/etc/my.conf文件,增加以下参数并重启mysql镜像。
[mysqld]
innodb_ft_min_token_size = 1
ft_min_word_len = 1
2、为字段增加全文索引
alter table t_product add fulltext index fdx_title(title);
3、修改查询语句,和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字
select * from t_product where match(title) against('keyword');
于是,噼里啪啦一顿操作,小帅搞出1.1 全文索引版本。
小帅:“淦,好险,差点被行服的人砍了,页面查询总算不卡了!总算可以去潇洒了。”
江华:“呵呵,你高兴得太早了。”
未完待续…