mysql or走索引吗_加了索引,mysql查询就一定会用吗?

723a2ff6aaa2cbc0cbbdd331edff34a4.png

7210a92c27a13d2d09627fe4bc9b76f4.png

小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况。我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是DBA小姐姐面试呀。

一 概述

日常处理mysql问题中,往往通过增加索引来提高查询速度,但在有些情况下,执行过程中并没有按照我们的预期结果执行,也就是说,即使字段加了索引,但现实也没有使用到,到底是什么地方出了差错,以下我们将一探究竟。

二 实验表结构声明:

我们将对以下表结构进行实际案例分析

CREATETABLE 

三 Mysql不走索引归类以及详细解析

根据实验表做具体case分析,归纳为以下几点:

1. 查询条件在索引列上使用函数操作,或者运算的情况

例如以下case是不走索引的:

explain select * from student where abs(age) =18;
explain select * from student where age + 1=18;

2. 查询条件字符串和数字之间的隐式转换

例如:name与age分别做字符串/数字(88)的隐式转换;

以下case走索引情况:

explain select * from student where name =’88’; 
explain select * from student where age='88'; 
explain select * from student where age =88;

以下case不走索引情况:

explain select * from student where name=88;

3. 特殊修饰符 %%, Or 将不走索引

explain select * from student where name like'%name%' ;
explain select * from student where name ='name' or age = 18;

4. 索引优化器选择最优的索引

这一点最重要,索引到底用不用,不是列加了索引就一定会用,而是根据索引优化器来决定。

索引优化器的存在,就是找到一个索引扫描行数最少的方案去执行语句。那么扫描行数怎么来判断的?是逐行统计数据表的数据吗?其实并不是,而是根据统计信息来估算的值。这个统计信息就是我们常说的索引的“区分度”。

显然,一个索引上不同的值越多,这个索引的区分度就越好。我们把一个索引上不同的值的个数,称之为“索引基数”。也就是说,基数越大,索引的区分度就越好,执行查询的行数就越少。如何查看索引基数呢?使用 show index from 表名,cardinality字段显示的就是索引的基数。

扩展:MySQL 是怎样得到索引基数的呢?不感兴趣的小伙伴可以飘过啦。

索引基数 = 采样统计*页数。采样统计就是避免把整张表取出来一行行统计做精准计算,以免消耗系统性能。在采样统计时,InnoDB默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。统计信息不是固定不变的,他会随着数据表的变化而变化。当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。

索引优化器实例一:

经常听人说,执行<>语句时,不走索引,今天我们将看一看实际执行情况,还是那句话,到底走不走,我们说了不算,还是索引优化器说了算:看截图 ,就会发现 <> 其实是走了索引。

80821359d62c63fb8909757334c4ffb0.png

为什么会出现这样的情景呢?因为 student表中10W多条数据的值全都是'name',索引基数太小,所以在执行<>'1name'查询时,实际上要查询条数为10多W条,如果走了name字段索引,其实和全表查询没什么区别,况且,执行name字段索引,最终还是要转换为主键索引(二级索引查询都会转换为主键查询),所以索引优化器的优化结果是不走name索引。然而在执行<>'name'查询时,优化器优化结果是走name索引,因为,<>'name'的查询行数很小,大部分条数name字段的值都是'name'。

索引优化器实例二:

同理,前缀like匹配是走索引,但是,以下却展示了不一样的结果:

cfb0ee4cc1d6092a7096d21388fe6920.png

为什么会这样呢?请小伙伴们参考实例一仔细思考一下。

如何指定优化器执行固定的索引?

索引优化器的存在,我们就没办法指定强制走我们指定的索引?答案就是通过 force index强制来实现,执行语句和分析结果如下图所示

5d71ebf43498875b5514d36ee4013d2f.png

四 总结以及实际应用

实际应用中,应该牢记上述索引优化的原则,比如在实际工作中,由于索引优化器选错索引,导致数据查询缓慢,阻塞线上业务,而当时的解决办法,就是上述文章的分析过程,以及采用force 强制索引才解决的,前车之鉴,希望广大读者避免踩坑。

更多信息请关注 微信公众号 : 白白家族

或扫描白白家族公众号二维码:

efbe0bebd525e61c9fa1ba0838b623f8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基本农田卫星地图查询_如何基于西安80坐标查询定位

1. 概述水经注软件除了可以轻松下载无水印Google Earth卫星影像、有明确拍摄日期的历史影像、地方高清天地图、百度高德大字体打印地图&#xff0c;且可按1万/5千等国家标准图幅下载&#xff0c;下载含高度的全国矢量建筑、全国乡镇及街区行政区划、地名点、高速铁路网、公交路…

tcp的无延时发送_高并发架构的TCP知识介绍

这是关于高并发架构网络协议基础知识的第二篇&#xff0c;编程路上的基础心法&#xff01;做为一个有追求的程序员&#xff0c;不能只满足增删改查&#xff0c;我们要对系统全方面无死角掌控。掌握了这些基本的网络知识后&#xff0c;相信一方面日常排错中会事半功倍&#xff0…

如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...

一、模型简介目前&#xff0c;生存分析领域&#xff0c;最常用的是Cox比例风险回归模型&#xff0c;该模型具有良好的特性&#xff0c;不仅可以分析各种自变量对生存时间的影响&#xff0c;而且对基准风险分布不作任何要求(半参数模型)。Cox模型使用时要满足一定的条件&#xf…

格兰杰因果关系检验r语言_R语言系列第四期:R语言单样本双样本差异性检验

之前详细介绍了利用R语言进行统计描述&#xff0c;详情点击&#xff1a;R语言系列第三期&#xff1a;①R语言单组汇总及图形展示、R语言系列第三期&#xff1a;②R语言多组汇总及图形展示、R语言系列第三期&#xff1a;③R语言表格及其图形展示从这个部分我们就开始为大家介绍统…

java 配置jmstemplate_SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解...

1.导入jar包&#xff1a;org.springframework.bootspring-boot-starter-activemqorg.apache.activemqactivemq-pool2.填写配置文件(application.properties)#设置JMS(AMQ)spring.activemq.broker-urltcp://localhost:61616spring.activemq.useradminspring.activemq.passwordad…

切面是异步还是同步操作‘_分布式中采用Logback的MDC机制与AOP切面结合串联日志...

导读&#xff1a;在实际开发中&#xff0c;打印日志是十分重要的。在生产环境中&#xff0c;如果日志打得好可以快速地排查问题&#xff0c;而在分布式的场景下&#xff0c;一个请求会跨越多个节点&#xff0c;既一个业务可能需要多个节点协调配合处理。那么日志将会分散&#…

java 图类_Java集合类,一张图说清楚!

作者&#xff1a;skywang12345https://www.cnblogs.com/skywa...2019-03-23 10:32:24Java集合是java提供的工具包&#xff0c;包含了常用的数据结构&#xff1a;集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*&#xff0c;Java集合主要可以划分为4个部分…

python 取整_马克的Python学习笔记#数字,日期和时间

对数值进行调整在Python中对整数和浮点数进行数字计算是很容易的。但是&#xff0c;如果你需要对分数&#xff0c;数组或者日期和时间进行计算&#xff0c;这就会稍微复杂点。对于简单的取整操作&#xff0c;我们可以使用内建的round(value, ndigits)函数就可&#xff0c;举个例…

各路由协议的协议号_厂房转让协议

厂房转让协议转让方(甲方)&#xff1a;________________受让方(乙方)&#xff1a;________________甲乙双方本着平等互利的原则&#xff0c;经协商一致就甲方将其权属的工业用地、厂房等转让与乙方及有关事项达成如下协议:一、工业用地及厂房产权基本情况本协议转让的工业用地位…

java web开发常见问题_JavaWeb学习笔记(五)--Web开发其他常见问题

一、把web应用打成war包使用JDK自带jar命令&#xff0c;进入到web应用里面&#xff0c;执行命令&#xff1a;jar -cvf 包名.war . # .表示当前目录所有的文件 直接用jar可查看帮助执行完成后生成一个demo.war文件&#xff0c;把这个文件拷贝到Tomcat的webapps下&#xff0c;Tom…

uwsgi怎么通过浏览器访问某个脚本_4个Shell小技巧帮你提高机器学习效率:写好脚本,事半功倍...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI在机器学习的实践过程中&#xff0c;用好Shell能帮你很多节省时间。最近&#xff0c;有位来自ETHZ的学生分享了一些Shell小技巧。对程序员来说&#xff0c;这些技巧更重要的是让你的思维从琐碎小事中解脱出来&#xff0c;大大提高…

间接寻址级别不同_被遗忘的利息税,国债与存款的利率区别,同大额存单的4点大不同...

2020年6月10日的储蓄式电子国债发行又一次与理财人擦肩而过&#xff0c;因为疫情管控原因&#xff0c;此次暂时不发行&#xff0c;那么下一个认购国债的窗口&#xff0c;就是7月10日&#xff0c;仍然是储蓄式电子国债&#xff0c;期限还是3年期和5年期两种。那么能如期发行吗&a…

抽象类可以用new创建对象吗_宠物可以用人类的湿巾吗?猫咪有泪痕可以用纸巾擦掉吗?...

宠物还有专用的湿巾&#xff1f;当然喽&#xff01;不养宠物的小伙伴可能是无法理解的&#xff0c;人类的生活条件好了&#xff0c;宠物的生活条件在很多方面比人类还更上一层台阶呢&#xff01;喜欢逛宠物店和宠物展的小伙伴都会有这样的感慨&#xff0c;那就是人生不如喵生狗…

java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

JAVA中线程在什么时候需要同步和互斥关注:265 答案:6 mip版解决时间 2021-01-27 08:10提问者时光易老2021-01-27 03:32JAVA中线程在什么时候需要同步和互斥?(假如这题是考试题&#xff0c;要怎样回答&#xff1f;)详细点最佳答案二级知识专家樱花雨梦2021-01-27 04:13例如访…

5g虚拟技术旅游_5G造就文旅新时代,驴迹科技探索智慧出行创新领域

随着我国5G技术的成熟与普及&#xff0c;5G为文旅产业提供新的解决方案&#xff0c;使之焕发新的活力。以5G“新基建”为依托&#xff0c;结合VR虚拟实境以及云计算、高清视频等技术交叉应用&#xff0c;对旅游业的发展带来广泛而深刻的影响&#xff0c;给游客更新鲜、更具有科…

分块排序算法 java_十大经典排序算法最强总结(含JAVA代码实现)

转载自&#xff1a;https://www.cnblogs.com/guoyaohua/p/8600214.html0、排序算法说明0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面&#xff1b;不稳定&#xff1a;如…

synchronized锁升级_synchronized详解以及锁的膨胀升级过程

点击上方"码之初"关注&#xff0c;选择"设为星标"与精品技术文章不期而遇来源&#xff1a;www.cnblogs.com/cxiaocai/p/12189848.html架构之路远且艰辛&#xff0c;但是学习的脚步始终不能停止&#xff0c;今天聊一聊synchronized。synchronized是jvm内部的…

改变php二维数组的值_php如何修改二维数组中的值?

php修改二维数组中值的方法&#xff1a;1、通过【for($i 0; $i < count(Array()); $i)】语句修改&#xff1b;2、通过foreach($users as &$user)语句修改。php修改二维数组中值的方法&#xff1a;1、二维数组可以通过for($i 0; $i < count(Array()); $i)这种形式…

jlabel字怎么变化_怎样才能把字写好?详解最科学的练字方法及步骤

一&#xff1a;正确的学习之路1&#xff1a;临帖从古到今&#xff0c;临帖是学习书法最基本的方法&#xff0c;没有一个书法家是没有临过帖的。2&#xff1a;专注专注学一个书法家的字&#xff0c;专心致志&#xff0c;认真临写&#xff0c;持之以恒&#xff0c;直到形同神似。…

找不到具有指定id_JAVA如何整合es指定字段不分词搜索?

一、问题在做一个需求的时候&#xff0c;需要按照电话号码查询用户关系&#xff0c;所以我这边先讲相关信息同步到es&#xff0c;但是电话号码是加密的&#xff0c;所以显示的字符串是杂乱的&#xff0c;既有字母&#xff0c;又有斜杠等号等字符&#xff0c;在进行分词查询的时…