索引失效的解决方案
在MySQL中,模糊查询肯定要使用LIKE关键字,然后再加 %,是代表前模糊还是后模糊。数据量小的情况下,不容易看出查询的效率,但是数据量达到百万级,千万级甚至更高的时候,查询的效率就很容易显现出来了。
项 | 索引是否失效 | 解决方法 |
col_name LIKE 'ABC%' | 索引有效 | |
col_name LIKE '%ABC' | 索引失效,使用全表扫描 | 翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引 |
col_name LIKE '%ABC%' | 索引失效,使用全表扫描 | locate, position, instr, find_in_set等方法 |
如下几种方法都是不走索引的,只是前三种方法稍快于LIKE
函数 | 作用 | 示例/说明 |
LOCATE(substr,str) |
返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。 如果str是字段,则查找字段内容,如果str不是字段,则将str作为要查的库。 |
SELECT LOCATE('xbar',`foobar`); #返回0 #若`foobar`是字段,则去此字段查询,而不是”foobar”字符串 SELECT LOCATE('bar',`foobarbar`); #返回4 SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`)>0 |
LOCATE(substr,str, pos) | 返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0。 | SELECT LOCATE('bar',`foobarbar`,5); #返回7 |
POSITION('substr' IN `field`) | 功能跟locate一样 |
SELECT `col` FROM `tb1` WHERE POSITION('keyword' IN `filed`) SELECT `column` FROM `table` WHERE POSITION('keyword' IN `filed`) |
FIND_IN_SET(str,strlist) |