| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 疫情期间跳广场舞?别忘了来学MySQL -> 正文阅读 |
|
[大数据]疫情期间跳广场舞?别忘了来学MySQL |
大家好,我是亚索! 最近大连新一轮疫情又席卷而来,某高校封校后青年男女们竟在宿舍跳起了广场舞?! 疫情之下,大家仍不忘进行一些丰富的娱乐文化生活,亚索提醒大家在开心 正题今天继续来介绍有关MySQL的一些干货吧!主要内容有MySQL一条Sql语句执行很慢的原因?查询语句索引失效的原因?。 这是后端Java面试官最爱问知识之一,据说也是 腾讯面试问过的真题 哈!知识介绍均来自互联网搜集资料以及课本笔记,如有重复涉及版权问题,纯属偶然,还请私信纠正一下哈。 Sql执行很慢原因:分类讨论!亚索觉得该问题属于开放性范畴,就像百度曾经问过的面试题:浏览器输入url回车之后,会发生什么? 细说起来会涉及到计算机网络的很多知识,sql语句执行很慢也能涉及到MySQL很多核心知识。 遇到问题不要慌张,首先理清楚逻辑,理性思考,亚索觉得这个问题则需要分类讨论:
Sql执行一直很慢的情况在MySQL数据量不变的情况下,Sql语句执行一直很慢,那么可能就是Sql语句书写的问题或者索引命中存在问题了。 比如有一个表,建表语句如下:
Sql查询语句如下:
那么这条语句查询效率慢,原因可能是: 1、age字段上并未建立索引,此时数据库则会自动走全表扫描,效率很低,很慢。 2、如果age字段上加了索引,但是由于一些错误的Sql书写方式,又会导致索引失效,数据库还是自动走全表扫描,比如语句为:
这种对索引字段在符号左边进行计算,或者进行函数操作的方式,是无法命中索引,亦称为索引失效。但若是" 另外,可以通过在sql语句前加上explain命令这种方式查看sql语句是否用到索引。 3、更深层次地,还有一个原因就是数据库自己不选索引,走全表扫描!或者选错了别的索引! 这个也可以归结为数据库索引失效情况之一,但这是数据库自己本身执行语句时出现了问题,不是Sql语句书写的毛病,比如:
这种情况下,就算age字段上建立了索引,数据库系统也不一定会走该索引,不一定是先查到age对应B+树的叶子节点中主键的值,再通过主键索引查询需要的整行数据返回(主键索引与非主键索引的区别,以后会介绍)。 系统是有可能直接扫描全表,找出符合"30 < age and age < 50"的整行数据。 数据库计算索引基数,存在采样失误 系统在执行这条语句的时候,会进行预测,即在走age字段索引,需要扫描多少行数据,如果预测到扫描行数过多,系统就可能不走索引而直接走全表扫描了。 数据库系统是通过遍历索引字段的部分数据,即通过 采样统计 的方式,预测计算出索引的基数。基数也叫做区分度,一个索引字段在一定范围内不同的值越多,意味着出现相同数值的索引越少,索引区分度就越高,即意味着age在30-50这个范围内的数据行数就越少。 假如age字段的基数(区分度)实际上是很大的,但索引系统在采样统计的时候,恰巧遍历了基数很小的那一部分数据(即重复率较高),然后就误以为该索引基数很小,在查询时数据库觉得走全表扫描更加高效,同样会导致最终不选索引,索引失效!!
有时候可以通过强制走索引的方式查询数据,比如:
或者可以用这条语句重新统计索引的基数:
也可以查看索引字段的基数等相关信息:
既然数据库会算错索引的基数,如果查询语句有涉及多个索引的时候,系统也有可能会选错走别的索引,这也同样可能会导致Sql执行很慢! 补充总结一下索引失效的原因有哪些:
Sql执行偶尔很慢的情况一条Sql语句执行偶尔很慢,亚索觉得这个语句可能是没有什么问题的,那原因主要有两个。 1、语句执行时,数据库正在刷脏页 当数据库插入或者更新一条数据的时候,我们知道数据库会在内存中把对应字段的数据更新了,但是更新之后,并不会马上同步持久化到磁盘中去,而是把这些更新的记录写入到 redo log 日志中去,等到空闲的时候,再通过 redo log 把最新的数据更新到磁盘中去。
数据库通过 redo log 将数据更新到磁盘中去的操作可以称为"刷脏页"。刷脏页有很多种场景,常见有4种,性能方面主要关注前2种:
2、Sql执行时遇到锁,如表级锁、行级锁 刚好这条语句涉及到的表,别的语句或者线程在用,并且加锁了,拿不到锁,只能慢慢等待别人释放锁了(表级锁)。或者,表没有加锁,但要使用到的某一行被加锁了(行级锁)。 如果要判断是否真的在等待锁,我们可以用 小结本文主要介绍了一下MySQL中一条Sql语句执行很慢的原因,大家如果在面试中被问到,一定要记得分类讨论哦! 总结一下,一条Sql语句执行很慢,分类讨论: 1、这条 SQL 语句一直执行的很慢,则有如下原因
2、大多数情况下很正常,偶尔很慢,则有如下原因
大家面试的时候,说完提纲要点以后,亚索觉得最好能详细展开陈述哈!说的越深,面试加分越多! 好了今天就说到这,我是亚索,关注我,大家一起学Java吧! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:52:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |