mysql如何优化like %关键字 查询?

在不使用lucene、Sphinx、solr等专门的全文检索开源工具和全文索引的情况下,如何优化mysql中的like '%关键字'
关注者
86
被浏览
148,553

15 个回答

我们经常在工作的时候会遇得到索引使用不当或者是模糊查询时间比较慢的问题

嘟嘟嘟,先开一下车~

在使用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%"并不合适所有的模糊查询

这个时候阿里巴巴就问到了我,如何解决上面的这个问题?

我们可以使用下面的方法:

LOCATE(substr,str), LOCATE(substr,str,pos)

第一个语法返回substr在字符串str 的第一个出现的位置。第二个语法返回子符串 substr 在字符串str,从pos处开始的第一次出现的位置。如果substr 不在str 中,则返回值为0 。

SELECT LOCATE('xbar',\`foobar\`); 
###返回0 
SELECT LOCATE('bar',\`foobarbar\`); 
###返回4
SELECT LOCATE('bar',\`foobarbar\`,5);
###返回7