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);

查询结果如下:

mysql全文检索语句 mysql做全文检索_全文检索


首先解释一下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之后无数个字符

查询结果:

mysql全文检索语句 mysql做全文检索_mysql全文检索语句_02


我们可以看到使用了like’%中国%’,查询到的结果是所有包含中国的数据,无论中国所属的位置。我为什么要说所属的位置呢,因为如果查询条件换成like’中%'即输入如下:

select title from news_info where title like'中%'

mysql全文检索语句 mysql做全文检索_数据_03


我们发现查询到的数据都是中国开头的,我们继续输入查询语句(这里就不查中了,因为数据库里没有以中为结尾的):

select title from news_info where title like'%会'

结果如下:

mysql全文检索语句 mysql做全文检索_mysql全文检索语句_04


我们发现查询到的数据都是末尾为会的。

我们总结一下:

'%X%'表示查询所有包含X的数据,不管位置。

'X%'表示查询以X为开头的数据。

'%X’表示查询以X为末尾的数据。

%表示n个字符。

检查自己是否使用了索引只需要在select的前面加上explain,即:

explain select title from news_info where title like '%中国%'

mysql全文检索语句 mysql做全文检索_sql语句_05


其中title字段设置了索引,所以下面查询显示的key存在,且type为index检索。

换一下查询内容:

explain select * from news_info where title like'%中%'

mysql全文检索语句 mysql做全文检索_sql语句_06


我们可以看到type是所有,且key为空,即没有用到索引。

正则表达

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。

通过实例讲解:
输入以下sql语句:

select title from news_info where title regexp '^中'

查询结果为:

mysql全文检索语句 mysql做全文检索_全文检索_07


出来这个结果应该很熟悉吧,比较上面的like用法也查出来过,通过查询的内容,我们发现regexp '^X’表示查询以X为开头的数据。

输入如下:

select title from news_info where title regexp '会$'
表示查询以会为结尾的数据

mysql全文检索语句 mysql做全文检索_mysql全文检索语句_08