mysql数据库进阶学习 二
- 全文检索
- 模糊查询 like用法
- 正则表达
全文检索
新建全文检索方式(支持中文全文检索):
本文使用mysql数据库版本为5.7+,InnoDB数据库引擎
全文检索解析器ngram(解决不支持中文检索方式,版本要求5.7.6+,为mysql内置插件,不需要安装,默认支持检索最短字符为2,即不支持单个字如’国’检索)
alter table news_info add fulltext index ft_in(title,category) with parser ngram;
第二种建立全文检索方法:
create fulltext index 检索名词(如:ft_in) on table_name(检索列名) with parser ngram;
其中fulltext表示全文,index索引,ft_in检索名称,(title,category)表示要设置全文检索的字段名,parser ngram即使用ngram全文解析。
执行完成后,就可以通过一下语句检索:
select *from news_info where match(title,category) against('中国' in boolean mode);
查询结果如下:
首先解释一下sql语句,使用全文检索的格式:
select xxx from table_name where
match(自己设置的检索字段名) against('xx' in boolean mode);
关于设置ngram的最短检索字符值,请自行百度。
使用全文检索在数据量较大的情况下,比(like’’)模糊查询要更快一筹。
模糊查询 like用法
其实使用全文检索也可以达到模糊查询的效果,这里不做比较
注意使用like方法实现模糊查询会使建立好的索引失效(前提是你查询的字段名不是你建立的索引,例:我查询name,where条件是phone like‘%XXX%’其中phone设置了索引,但是name没有,那模糊查询就不会使用索引,如果查询的是phone,则模糊查询还是会使用索引,这是一个很细的细节哦)
关于检索的用法请看:mysql复合索引 使用sql语句:
select title from news_info where title like '%中国%'
这种like '%X%'是指查询包括x的所有数据,%指的是X之前无数个字符,或是X之后无数个字符
查询结果:
我们可以看到使用了like’%中国%’,查询到的结果是所有包含中国的数据,无论中国所属的位置。我为什么要说所属的位置呢,因为如果查询条件换成like’中%'即输入如下:
select title from news_info where title like'中%'
我们发现查询到的数据都是中国开头的,我们继续输入查询语句(这里就不查中了,因为数据库里没有以中为结尾的):
select title from news_info where title like'%会'
结果如下:
我们发现查询到的数据都是末尾为会的。
我们总结一下:
'%X%'表示查询所有包含X的数据,不管位置。
'X%'表示查询以X为开头的数据。
'%X’表示查询以X为末尾的数据。
%表示n个字符。
检查自己是否使用了索引只需要在select的前面加上explain,即:
explain select title from news_info where title like '%中国%'
其中title字段设置了索引,所以下面查询显示的key存在,且type为index检索。
换一下查询内容:
explain select * from news_info where title like'%中%'
我们可以看到type是所有,且key为空,即没有用到索引。
正则表达
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
通过实例讲解:
输入以下sql语句:
select title from news_info where title regexp '^中'
查询结果为:
出来这个结果应该很熟悉吧,比较上面的like用法也查出来过,通过查询的内容,我们发现regexp '^X’表示查询以X为开头的数据。
输入如下:
select title from news_info where title regexp '会$'
表示查询以会为结尾的数据