模糊查询能否或者怎么使用索引
前言
众所周知,在索引时,如果模糊查询的%置于最前面,索引会失效。但是在%前置时,什么情况下会使用到索引?
补充
-
like %keyword
索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。 -
like keyword%
索引有效。 -
like %keyword%
索引失效,也无法使用反向索引。
解决
方式一
反转模糊查询的字段,但是注意,对于%keywork%
的索引,此方法是无效的。
select * from company where companyName like '%江南皮革长';
我们可以改造为:
select * from company where reverse(companyName) like reverse('%江南皮革长');
方式二
首先我们有TEST_USER表:
CREATE TABLE `USER` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`NAME` varchar(64) DEFAULT NULL COMMENT '名字',
`MOBILE` varchar(11) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`ID`),
KEY `INDEX_MOBILE` (`MOBILE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试的用户表';
只查询索引
EXPLAIN SELECT
MOBILE
FROM
USER
WHERE
MOBILELIKE '%151'
Extra:Using index. (走索引)
查索引字段和主键
EXPLAIN SELECT
ID,MOBILE
FROM
USER
WHERE
MOBILE LIKE '%151'
Extra:Using index. (走索引)
查非索引字段
EXPLAIN SELECT
MOBILE,NAME
FROM
USER
WHERE
MOBILE LIKE '%151'
Extra:Using where. (不走索引)
where后面多条件
where后跟普通条件
EXPLAIN SELECT
MOBILE
FROM
USER
WHERE
NAME = '江南皮革厂'
AND MOBILE LIKE '%151'
Extra:Using where. (不走索引)
where后跟主键
EXPLAIN SELECT
MOBILE
FROM
USER
WHERE
ID >1
AND MOBILE LIKE '%151'
Extra:Using index. (走索引)
总结
like查询百分号前置,并不是100%不会走索引。
如果只select索引字段,或者select索引字段和主键,也会走索引的。
如果where条件中有主键时,走索引。
一句话:在select和where中存在除了索引和主键外的其他条件或字段时,不走索引。