• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

【转】【MySQL】Mysql模糊查询like提速优化 - 梦琪小生

Data: 2013-07-04 04:37:58Form: JournalClick: 10

【转】【MySQL】Mysql模糊查询like提速优化

在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很重要!

一般情况下like模糊查询的写法为(field已建立索引):

SELECT `column` FROM `table` WHERE `field` like '%keyword%';

上面的语句用explain解释来看,SQL语句并未用到索引,而且是全表搜索,如果在数据量超大的时候,可想而知最后的效率会是这样

对比下面的写法:

SELECT `column` FROM `table` WHERE `field` like 'keyword%';

这样的写法用explain解释看到,SQL语句使用了索引,搜索的效率大大的提高了!

但是有的时候,我们在做模糊查询的时候,并非要想查询的关键词都在开头,所以如果不是特别的要求,"keywork%"并不合适所有的模糊查询

这个时候,我们可以考虑用其他的方法

1.LOCATE('substr',str,pos)方法

备注:返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0。

备注:keyword是要搜索的内容,field为被匹配的字段,查询出所有存在keyword的数据

2.POSITION('substr' IN `field`)方法

position可以看做是locate的别名,功能跟locate一样

3.INSTR(`str`,'substr')方法

除了上述的方法外,还有一个函数FIND_IN_SET

FIND_IN_SET(str1,str2):

返回str2中str1所在的位置索引,其中str2必须以","分割开。

 

PS.测试结果,似乎速度变化不大,貌似索引依然没用起来(普通索引)

原文地址:https://blog.csdn.net/forest_fire/article/details/73613725

#1楼 2019-09-18 14:50 Merrizee

 

https://pic.cnblogs.com/face/1754656/20190728221123.png   

 

#2楼 [楼主] 2019-09-18 15:29 梦琪小生

 

@ Merrizee
WHERE `field` like 'keyword%'; 这样是可以提速的,前后都有%是不能提速的。速度测试的话,数据大应该会明显。
https://pic.cnblogs.com/face/363076/20130831151026.png   

 

#3楼 2019-09-18 15:34 Merrizee

 

我现在用的是 concat(字段,字段,字段) like '% %' 待会试试能不能结合起来
https://pic.cnblogs.com/face/1754656/20190728221123.png   

 

#4楼 2020-02-13 12:55 破茧之初

 

内容:a【空格】【空格】b
我用a【空格】b去模糊搜索这个内容请问怎么才能加快效率搜索到呢
https://pic.cnblogs.com/face/1348858/20191223172358.png   

 

#5楼 [楼主] 2020-02-13 13:13 梦琪小生

 

@ 破茧之初
你可以用SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`)>0 这个方法试试看,能不能提速。字段记得设置成索引。我都好久没用数据库了。。
https://pic.cnblogs.com/face/363076/20130831151026.png   

 

#6楼 2020-02-13 13:36 破茧之初

 

@ 梦琪小生

但是这样都搜索不到内容了,我的内容是:文字(多个空格)文字(eg:a b)
搜索字段:a b
eg:搜索条件 a b 去搜索 数据库内容为 a b
我是%a%b%模糊搜索到的
https://pic.cnblogs.com/face/1348858/20191223172358.png   

 

#7楼 [楼主] 2020-02-13 15:20 梦琪小生

 

@ 破茧之初
空格去掉 LOCATE('qing', `user_name`)>0 and LOCATE('001', `user_name`)>0 and LOCATE('2', `user_name`)>0
因为你要3个条件都满足,所以用and链接。我没测试,你试试看
https://pic.cnblogs.com/face/363076/20130831151026.png   

 

#8楼 2020-02-13 15:43 破茧之初

 

@ 梦琪小生 这样可以了,十分感谢博主提供方法!不过实际上我个字段这个很多是英文长段,这样在sql拼写会不会影响到效率呢
https://pic.cnblogs.com/face/1348858/20191223172358.png   

 

#9楼 [楼主] 2020-02-13 15:54 梦琪小生

 

@ 破茧之初语句拼接很快的,执行速度你可以和 直接like 比较下,哪个快。最好是大数据的情况下测试下。具体哪个快,我也不确定。。

 

Name:
<提交>