一篇文章了解Like用法及常见索引失效情况

23 篇文章 7 订阅
订阅专栏

1.简介

本文主要通过介绍Like索引及常见索引失效情况,以MySQL为例。

2.EXPLAIN关键字

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划。

EXPLAIN 语句 就可以看到某个查询数据的执行计划,以下是执行计划的各个参数:
在这里插入图片描述
语句使用:

EXPLAIN select * from user

3.Like索引失效情况

1. 使用 3%进行查询索引不会失效

explain SELECT * from tb_user where page like ‘3%’

在这里插入图片描述
可以看到可以使用的索引是page,实际使用索引page。

2. 使用 %3进行查询索引会失效

explain SELECT * from tb_user where page like ‘%3’

在这里插入图片描述
使用%3查询走的是全表扫描,并没有用到page索引。

解决办法
1.创建倒叙索引,reverse()

reverse()应用场景,比如你根据身份证查询一个市洲的人员信息。众所周知,同一个市洲大部分人员身份证前6位是相同的,比如黄石,前六位420222。这个时候你就可以通过reverse()字段,创建身份证后6位的前缀索引进行查询。

CREATE INDEX pagereverse ON tb_user (reverse(page ));

2.修改SQL语句

select page from tb_user where reverse(page ) like reverse(‘%3’);

在这里插入图片描述
没有进行全表扫描,使用并走了pagereverse 索引

3. 使用%3% 进行查询索引会失效

1. like concat(‘%’, ‘3’, ‘%’)

explain SELECT * from tb_user where page like concat(‘%’, ‘3’, ‘%’)

索引失效,未走索引
在这里插入图片描述
50w数据查询,耗时0.410s在这里插入图片描述

2.使用LOCATE函数

explain SELECT * from tb_user where LOCATE(‘3’, page)>0

索引失效,未走索引
在这里插入图片描述50w数据查询,耗时0.403s
在这里插入图片描述
3.使用POSITION函数

explain SELECT * from tb_user where POSITION(‘3’ in page)>0

索引失效,未走索引
在这里插入图片描述

50w数据查询,耗时0.406s
在这里插入图片描述
4.使用INSTR函数

explain SELECT * from tb_user where INSTR(page,‘3’)>0

索引失效,未走索引
在这里插入图片描述
50w数据查询,耗时0.411s
在这里插入图片描述

个人觉得前期如果数据量不大,其实是可以用like的。毕竟其实在少量数据的情况下他们的查询效率都差不多。目前还没有测试过千万数据或者亿及数据他们的效率是怎样。

5.常见索引失效情况

1、使用like后面紧跟着%,如’%3’

explain SELECT * from tb_user where page like concat(‘%’, ‘3’,‘%’)

在这里插入图片描述
2、查询数据占总数据 30% 则MYSQL不会再使用索引。因为使用索引的开销反而更大。

SELECT count(*) from tb_user_copy1

总条数: 416853
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age between 1 and 3

rows预计扫描行数96168,占比百分之23 走索引

在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age between 1 and 4

rows预计扫描行数超过百分之30 ,未走索引
在这里插入图片描述
也可以使用 force index(age) 让MySQL强行使用索引查询

explain SELECT * FROM tb_user_copy1 force index(age) where age BETWEEN 1 and 4

在这里插入图片描述

3、不满足最左匹配原则
建立了一个name,age联合索引
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age =4

未走索引,全表扫描
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where name LIKE ‘w%’ and age =4

走了联合索引
在这里插入图片描述

4、字符串不加单引号索引会失效

explain SELECT * FROM tb_user_copy1 where name=123

未走索引,全表扫描
在这里插入图片描述

5、mysql使用不等于(!= 或者<>)的时候,无法使用索引,会导致索引失效

explain SELECT * FROM tb_user_copy1 where age >=5

全表扫描,未使用索引
在这里插入图片描述
6.where 子句里对有索引列使用函数,用不上索引

explain SELECT * FROM tb_user_copy1 where ABS(age) =5

全表扫描,未使用索引
在这里插入图片描述
7.where中索引列有运算

explain SELECT * FROM tb_user_copy1 where age *2 =10

全表扫描,未使用索引
在这里插入图片描述

8、is null可以走索引,is not null无法使用索引

explain SELECT * FROM tb_user_copy1 where name is null

is null走了索引
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where name is not null

is not null 未走索引
在这里插入图片描述

9、条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

explain SELECT * FROM tb_user_copy1 where name = “G1” or age =8

只有一个age索引情况,未走索引
在这里插入图片描述age和name索引都有,走了索引
在这里插入图片描述

【项目实战】使用LIKE操作符可能导致MySQL索引失效
本本本添哥
01-22 677
同事遇到一个生产问题,MySQL-like可能导致索引失效,这个问题如果我遇到我会怎么处理呢?其实我一点思路都没有,因为我对索引熟悉度不高,下面来简单学习下索引失效的相关的内容!MySQL中的LIKE操作符在某些情况下可能导致索引失效,这主要是由于LIKE操作符的特性以及MySQL的查询优化器如何处理这些查询,导致全表扫描,从而影响查询性能。
聊聊索引失效的10种场景,巨坑
lisu061714112的专栏
01-09 6667
前言 我之前写的一篇文章《聊聊sql优化的15个小技巧》,自发表之后,在全网广受好评,被很多大佬转载过,说明了这类文章的价值。 今天我接着上一期数据库的话题,更进一步聊聊索引的相关问题,因为索引是大家都比较关心的公共话题,确实有很多坑。 不知道你在实际工作中,有没有遇到过下面的这两种情况: 明明在某个字段上加了索引,但实际上并没有生效。 索引有时候生效了,有时候没有生效。 最近无意间获得一份BAT大厂大佬写的刷题笔记,一下子打通了我的任督二脉,越来越觉得算法没有想象中那么难了。 BAT大佬写的刷题笔记
MySQL中like关键字与索引的使用
Socrates的技术笔记
04-24 728
使用like进行查询的逻辑其实非常符合我们的直接的认知。就像在bash中使用grep来筛选命令行的结果和like其实是同样的逻辑。只是如果数据库中的数据很多时,我们需要通过其他的方法来缩减直接应用like的范围而已。
SQL中LIKE查询是否使用索引
最新发布
xycxycooo的博客
07-28 479
前缀匹配通常可以使用索引。精确匹配等同于,索引会被使用。后缀匹配:某些数据库支持后缀索引,可以使用索引。中间匹配通常不会使用索引。使用ESCAPE:通过ESCAPE关键字改变通配符含义,可能使索引可以使用。在实际应用中,应根据具体的查询模式和数据库系统的特性来判断LIKE查询是否使用索引,并采取相应的优化措施。
like查询与索引
wjxbj的博客
08-04 1336
一.like查询与索引         在oracle里的一个超级大的表中,我们的where条件的列有建索引的话,会走索引唯一扫描INDEX UNIQUE SCAN。如select * from table where code = 'Cod25',而如下这些语句哪些会走索引呢? select * from table where code like 'Code2%' select * ...
MySQL-like可能导致索引失效
zym_1321的博客
07-04 6736
一、like导致的索引失效 1、新建一张用户表并创建address索引 CREATE TABLE `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(16) CHARACTER SET latin1 DEFAULT '', `age` tinyint(4) DEFAULT '0', `address` varchar(32) CHARACTER SET latin1 DEFAULT '', PRIMARY
索引失效情况之like
Kaiser__的博客
05-24 714
在学习索引时,有一个问题通常很绕,那就是like。它有时可以使用到索引,而有时又不可以使用到索引。因此,今天按照我的个人理解对like进行一个总结。希望可以帮助到初学者,也欢迎大家一起讨论。
mysql的like是否使用索引
mywaster的专栏
05-23 7969
mysql在使用like查询中,能不能用到索引?在什么地方使用索引呢? 在使用like的时候,如果使用‘%%’,会不会用到索引呢? EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';  上面的结果是全表扫描,并没有使用到索引。 只是使用一个%的查询结果: EXPLAIN SELECT * FRO
面试填坑之Mysql无底洞(一、sql优化及索引失效)
tiantang_zy的博客
03-28 713
MySql优化 1、查询缓存 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query C...
面试官:聊聊索引失效的10种场景,能回答一半就算过
m0_71777195的博客
09-09 290
今天我聊聊索引的相关问题,因为索引是大家都比较关心的公共话题,确实有很多坑。不知道你在实际工作中,有没有遇到过下面的这两种情况:明明在某个字段上加了索引,但实际上并没有生效。索引有时候生效了,有时候没有生效。今天就跟大家一起聊聊,mysql数据库索引失效的10种场景,给曾经踩过坑,或者即将要踩坑的朋友们一个参考。
这样的sql语句会走索引吗?(Mysql索引失效的场景有哪些)如何优化等?(Java开发高性价比面经补充)
StefanSSSS的博客
09-17 829
这样的sql语句会走索引吗?(Mysql索引失效的场景有哪些)如何优化等? 有一个sql语句:一个查询语句 a b c三个字段建立了联合索引,查询条件是 a='' and b in '' and c = '' ,这个会走索引吗?如果不走为什么 如果走,走哪些索引
MySQL索引初识篇:索引机制、索引分类、索引使用与管理综述
Huangjiazhen711的博客
09-27 696
对于MySQL索引就是用来帮助表快速检索目标数据的。此时先来简单回顾一下MySQL索引是如何使用的呢?首先需要创建索引MySQL可以通过三种方式创建一个索引
MySQL使用LIKE索引是否失效的验证
zxrhhm的博客
07-06 1162
MySQL使用LIKE查询时索引是否失效的验证
MySQL 使用 like “%x“,索引一定会失效吗?
小林coding
01-25 8325
大家好,我是小林。 昨天发了一篇关于索引失效文章:谁还没碰过索引失效呢 我在文末留了一个有点意思的思考题: 这个思考题其实是出自于,我之前这篇文章「一条 SQL 语句引发的思考」中留言区一位读者朋友出的问题。 很多读者都在留言区说了自己的想法,也有不少读者私聊我答案到底是什么? 所以,我今晚就跟大家聊聊这个思考题。 题目一 题目一很简单,相信大家都能分析出答案,我昨天分享的索引失效文章里也提及过。 **「题目 1 」**的数据库表如下,id 是主键索引,name 是二级索引,其他字段都是非索引字段。
索引失效场景和使用like时,左边的%一定不走索引吗?
qq_39187593的博客
09-18 1243
记忆“模型数空运最快”
【为什么LIKE以%开头索引会失效】
Java程序员廖志伟
07-19 1886
数据库中使用LIKE语句进行模糊匹配时,如果通配符“%”出现在查询条件的开头,可能会导致索引失效,这是因为大多数索引默认是按照从左到右的顺序进行匹配的。但是,如果查询条件中的通配符“%”出现在开头,索引就无法按照从左到右的顺序匹配。如果我们在“name”列上创建了一个普通的B-Tree索引MySQL将按照索引的顺序逐个匹配每个字符,直到找到所有以“abc”开头的行。例如,假设我们有一个包含100万行的表,其中有一个名为“name”的列,我们希望查询所有以“abc”开头的行。
mysql like 不支持[]_MySQL-like可能导致索引失效
weixin_39953845的博客
02-26 622
一、like导致的索引失效1、新建一张用户表并创建address索引CREATE TABLE `user_info` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(16) CHARACTER SET latin1 DEFAULT '',`age` tinyint(4) DEFAULT '0',`address` varchar(32) C...
MySQL 面试题(一):索引失效的几种情况
水滴的博客
02-01 4438
又到了跳槽季,今天我们来看一个被高频问到的面试题:MySQL 索引失效有哪些情况?我列举了下面几种,如果小伙伴们有补充的,欢迎给我留言哦。
like ‘%ids%‘ 索引失效解决方法
weixin_43885078的博客
05-09 2296
like时索引失效解决方法
关于like造成索引失效情况
07-28
数据库中,索引是用于加快查询速度的数据结构。然而,有些情况下使用"like"操作符可能会导致索引失效,从而影响查询性能。以下是一些可能导致索引失效情况: 1. 前导通配符:如果在"like"操作符中使用前导通配符(比如'%abc'),那么索引将无法使用。因为索引是按照值的顺序存储的,而前导通配符会导致匹配过程变得无序,从而使索引无效。 2. 多个通配符:如果在"like"操作符中使用多个通配符(比如'%abc%'),同样会导致索引失效。因为多个通配符的存在会增加查询的复杂性,使得索引无法准确地定位匹配的值。 3. 字符集问题:有些数据库中的索引是基于特定字符集进行排序和比较的。如果在"like"操作符中使用不同字符集的值进行匹配,可能会导致索引失效。 为了避免索引失效,可以考虑以下方法: 1. 尽量避免在查询中使用前导通配符或多个通配符,尽量使用精确匹配来利用索引。 2. 如果需要模糊匹配,可以考虑使用全文搜索引擎或者专门为模糊查询设计的索引技术,如全文索引或倒排索引。 3. 确保在"like"操作符中使用的值与索引所使用的字符集一致,以保证索引的有效性。 总之,合理使用"like"操作符并注意索引的使用情况,可以提高查询性能并避免索引失效的问题。
写文章

热门文章

  • MySQL是如何保证主从一致的 12769
  • MySQL(Select count(*))为什么这么慢!!! 12244
  • 一篇文章了解Like用法及常见索引失效情况 11528
  • MySQL是如何保证数据不丢失的 11276
  • MySQL数据库备份(Linux操作系统) 11079

分类专栏

  • MySQL 23篇
  • JVM 3篇
  • spring全家桶 12篇

最新评论

  • MySQL数据库备份(Linux操作系统)

    又 欠: 其他方式试过了吗

  • MySQL数据库备份(Linux操作系统)

    qq_57935235: 老师执行tail -f -n 200 /var/spool/mail/root, 然后提示 tail: 无法打开"/var/spool/mail/root" 读取数据: 没有那个文件或目录 tail: 没有剩余文件

  • MySQL(Select count(*))为什么这么慢!!!

    又 欠: 对,一个是全表扫描。一个则是根据B+树统计

  • MySQL(Select count(*))为什么这么慢!!!

    懵知小屁孩: 请问count(字段),字段建索引,则统计索引的数据,没有建索引扫描表,是否是这样

  • Activiti工作流并行网关驳回在发起问题

    又 欠: 网关没有配置哦

最新文章

  • String的intern()方法详解
  • 双亲委派机制的作用
  • SpringBoot的自动装配源码分析
2023年18篇
2022年38篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家甘肃抽象玻璃钢雕塑徐州玻璃钢雕塑设计与制作珠海玻璃钢地貌图雕塑关公玻璃钢雕塑工业人物玻璃钢卡通雕塑茶油玻璃钢雕塑河南玻璃钢浮雕室外雕塑小品玻璃钢雕塑巧克力摆件平凉仿真人物玻璃钢雕塑订做马鞍山水果玻璃钢雕塑设计代理玻璃钢蔬菜雕塑巴中城市玻璃钢雕塑珠海生产玻璃钢雕塑开封玻璃钢人物雕塑厂家玻璃钢抗战人物雕塑组合式玻璃钢雕塑龙岩玻璃钢人物雕塑丽江玻璃钢雕塑定做驻马店佛像玻璃钢景观雕塑公司美陈商场步行街云南卡通玻璃钢雕塑玻璃钢雕塑仿真瓜果湖北桃子玻璃钢雕塑厂苏州玻璃钢仿铜雕塑厂家六安玻璃钢雕塑设计玻璃钢雕塑居家摆件玻璃钢雕塑钢琴图片周口玻璃钢雕塑加工厂海南玻璃钢花盆造型玻璃钢动画雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化