在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很重要。
1 查询方式
1.1 like
like查询是最常用的模糊查询方式,一般SQL写法如下:
- field建立索引提高查询效率,但建立索引会带来系统性能损耗
SELECT `column` FROM `table` WHERE `field` like '%keyword%'; SELECT `column` FROM `table` WHERE `field` like 'keyword%';
Explain查看执行情况:
虽然在field字段建立了索引,但第一种SQL语句无法使用索引,而且进行了全表搜索,数据量大时,效率会严重下降;第二种写法用到了索引提高了查询性能,但是以keyword开头的模糊查询并不满足所有情况。
1.2 LOCATE
语法:LOCATE('substr',str,pos)
- 说明:
- 若pos不存在,返回substr在str中第一次出现的位置,如果substr在str中不存在,返回值为 0 。
- 若pos存在,返回substr在str第pos个位置后第一次出现的位置,如果substr在str中不存在,返回值为0。
- 模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`)>0;
1.3 POSITION
语法:POSITION('substr' IN `field`)
- 说明:position可以看做是locate的别名,功能跟locate一样
- 模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE POSITION('keyword' IN `filed`);
1.4 INSTR
语法:INSTR(`str`,'substr')
- 说明:功能跟instr一样
- 模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword' )>0;
1.5 FIND_IN_SET
语法:FIND_IN_SET(str1,str2)
- 说明:返回str2中str1所在的位置索引,其中str2必须以","分割开。
- 模糊查询,SQL写法:
SELECT `column` FROM `table` WHERE FIND_IN_SET('keyword', `filed`);
1.6 全文索引
全文索引参考:http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html
2 总结
综合来看前面的几种查询方式,由于like的查询局限性,可以用locate, position, instr替代,而且速度上比like要快。
继续阅读
微信公众号
分享IT信息技术、北海生活的网站。提供北海本地化的信息技术服务。