可以看出,索引的排列顺序是根据比较字符串的首字母排序的,如果首字母相同,就根据比较第二个字母进行排序,以此类推。
我们在进行模糊查询的时候,如果把 % 放在了前面,最左的 n 个字母便是模糊不定的,无法根据索引的有序性准确的定位到某一个索引,只能进行全表扫描,找出符合条件的数据。
如:where like '%sme'
因为最左是%,无法确定是哪一个字母,只能根据sme去全表扫描找到符合的数据。
模糊查询时,把 % 放在最左是违背了索引有序排列的规则,就会造成索引失效,进行全表扫描。
在使用联合索引时也是如此,如果违背了索引有序排列的规则,同样会造成索引失效,进行全表扫描。
表test有个组合索引为:(A,B,C)
SELECT * FROM test WHERE A=1 and B =1 and C=1; 可以走索引;
SELECT * FROM test WHERE A=1 and C =1 and B=1; 可以走索引;
where 条件中只要有A就会走索引。
SELECT A FROM test WHERE C =1 and B=1 ORDER BY A; 可以走索引
SELECT B FROM test WHERE C =1 and B=1 ORDER BY A; 可以走索引
SELECT C FROM test WHERE C =1 and B=1 ORDER BY A; 可以走索引
SELECT A,C FROM test WHERE C =1 and B=1 ORDER BY A; 可以走索引
(上面使用了覆盖索引)
SELECT * FROM test WHERE C =1 and B=1 ORDER BY A; 不可以走索引
(可通过EXPLAIN查看是否走索引)
昨天早上接到一个任务,查询某类商品,
数据库
用的是
mysql
,版本是5.6.37,es_product 表数据不多,两万多条。执行语句我简化了一下,类似下面的这条sql:
SELECT * FROM es_product WHERE goods_code LIKE 'meiju%';
goods_code是建了
索引
的,
索引
类型Normal。
语句执行的很慢,我们看下它的执行计划是什么:
EXP...
2、or语句两边没有全部使用
索引
3、组合
索引
,使用的不是第一列
索引
,
索引
失效
,即最
左
匹配规则。
4、数据类型出现隐式转换,如varchar不加单引号的时候可能
会
自动转换为int类型,这个时候
索引
失效
。
5、在
索引
列上使用IS NULL或者IS NOT NULL时候,
索引
失效
,因为
索引
是不
索引
空值的。
6、在
索引
字段上使用not 、<> 、!=时不
会
使用
索引
,对于这样的处理只
会
进行全表扫描(>=和=<可以使用
索引
)
1、 在业务流程里时常使用到
模糊查询
,
模糊查询
是通过在输入的查询条件作为一个子字符串到一个字符串中查询是否查询此子字符串。如现在有一个字符串未“张三和李四”,输入“张三”或者“李四“都可以查询到此字符串。因为“张三”和“李四“都是属于字符串“张三和李四”的子字符串。那么就可以根据这种原理去查询数据是通过筛选数据。
2、 如下图所示,看搜索区域,可以通过仓库编号、仓库名称、联系人、电话来查询数据、而...
索引
失效
问题是面试必问问题,因为
索引
失效
的情况比较多,很多同学记不住,面试的时候回答不好。我仔细研究了七七四十七天,设计了一句七字口诀,记住这句口诀,以后再遇到这个问题就可以拿满分了。
七字口诀就是:模 型 数 空 运 最 快
口诀字面意思就是,要运送一个产品模型的话,要用空运,不要用陆运和海运,数空运最快。叫做:模型数空运最快。
下面我拆开逐字讲解一下:模:
模糊查询
的意思。like的
模糊查询
以%开头,
索引
失效
。比如:
SELECT * FROM `user` WHERE `name` LI...
我们在使用like 通配符有下面三种用法,其中第1和第2的用法
会
引起
索引
失效
的问题。这是因为
MySQL
的
索引
是按照从
左
到右的顺序进行匹配的,而前导通配符(比如%abc)
会
导致无法按照
索引
顺序进行匹配。1. 用REVERSE 函数,此方案只适用于like前
模糊查询
,不适用于前后
模糊查询
。2. 在单引号外面再包一层双引号,这样
索引
就可以生效了。1、like '%sample' ——>
失效
。2、like '%sample%' ——>
失效
。代码里的SQL格式参考。
解释一: 就是select的数据列只用从
索引
中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的
索引
覆盖。
解释二:
索引
是高效找到行的一个方法,当能通过检索
索引
就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个
索引
包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖
索引
。
(即select和where条件中的字段都出现在
索引
中,即为覆盖
索引
)
解释三:是非聚集组合
索引
的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索..