like使用索引如何避免失效

1、创建表
在这里插入图片描述
2、准备数据
在这里插入图片描述
3、在name和address上创建索引,不对fav创建索引
在这里插入图片描述
3.1.1 使用like模糊查询全部字段的的情况
a、当两边使用%时:
在这里插入图片描述
结果是全表扫描,索引失效
在这里插入图片描述
b、当左边使用%时:
在这里插入图片描述
结果也是全表扫描,索引失效
在这里插入图片描述
c、当右边使用%时
在这里插入图片描述
结果是range,索引生效
在这里插入图片描述
由上述三种情况:当使用like模糊查询所有字段(包括不包含在索引列中的字段)时,只有%放在右边索引才会生效
3.1.2 但我们实际的应用场景中,大部分都是需要两边使用%的。
使用like模糊查询,两边都是用%的情况

a、explain select id from test where name like ‘%三%’,因为id是主键所以有索引,而name也在索引列,所以索引生效,也结果如下:
在这里插入图片描述
b、explain select name from test where name like ‘%三%’,因为name 在索引列,所以索引生效,结果如下:
在这里插入图片描述
c、explain select address from test where name like ‘三%’,因为address和name都在索引列,所以索引生效。结果如下:
在这里插入图片描述
d、explain select id,name from test where name like ‘%三%’,因为name,id都在索引,所以索引生效,结果如下
在这里插入图片描述
e、explain id,name,address from test where name like ‘%三%’,因为name,id,address都在索引,所以索引生效,结果如下;
在这里插入图片描述
同理可得,只要查询的字段及where条件字段是在索引列的情况下,索引都不会失效。

f、explain select * from test where name like ‘%三%’,因为*包括了fav字段,它不再索引列,所以索引失效,结果如下
在这里插入图片描述
g、explain select id,name,address from test where fav like ‘%b%’,因为where条件里的fav不在索引列,所以索引失效,结果如下:
在这里插入图片描述
通过上面的例子,我们可以得出,两边都是用%的情况下,当这个作为模糊查询的条件字段(例子中的name)以及所想要查询出来的数据字段(例子中的 id & name & address)都在索引列上时,才能真正使用索引,否则,索引失效全表扫描(比如多了一个 fav 字段)。我想,这应该就是 ‘覆盖索引(索引覆盖)’ 的本质吧。同时,这也能很好的证实 “尽量避免SELECT * 而是一一罗列出所需要查询的字段” 的道理吧,因为,搞不好 SELECT * 就多了一个字段,就导致了全表扫描。

覆盖索引

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
只扫描索引而无需回表的优点:
1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当 SQL 中使用 LIKE 操作符进行模糊匹配时,如果没有正确使用索引,可能会导致索引失效,从而影响查询性能。以下是一些可能导致 LIKE 索引失效的情况: 1. 前导通配符:如果 LIKE 表达式以通配符 '%' 开头,索引将无法有效利用。例如,"WHERE column LIKE '%abc'",这种情况下索引将无法生效。 2. 不适当的通配符位置:如果 LIKE 表达式中的通配符位于开头和结尾之间,而不是结尾之后,索引的效果可能会减弱。例如,"WHERE column LIKE 'abc%def'",索引可能无法完全匹配。 3. 多个通配符:如果 LIKE 表达式中包含多个通配符,如 '%' 或 '_',索引可能无法生效。例如,"WHERE column LIKE '%abc%def%'",这种情况下索引可能无法使用。 4. 字符集问题:如果列的字符集与 LIKE 表达式中的字符集不匹配,索引可能无法使用。确保字符集一致可以提高索引的效果。 5. 数据类型问题:如果列的数据类型与 LIKE 表达式中的数据类型不匹配,索引可能无法使用。确保数据类型一致可以提高索引的效果。 为了让 LIKE 操作符在查询中有效利用索引,可以考虑以下方法: - 尽量避免在 LIKE 表达式的开头使用通配符。 - 使用索引友好的通配符位置,将通配符放在结尾之后。 - 避免使用多个通配符。 - 确保字符集和数据类型一致。 如果以上方法无法解决问题,可以考虑其他技术手段,如全文搜索引擎或者使用其他类型的索引(如全文索引),以满足模糊查询的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值