写点什么

SQL:我为什么慢你心里没数吗?,java 面试说我基础太差

用户头像
极客good
关注
发布于: 刚刚


注意这里只是临时开启了慢查询日志,如果 mysql 重启后则会失效。可以 my.cnf 中进行配置使其永久生效。

存在原因

知道了如何查看执行慢的 SQL 了,那么我们接着看读操作时为什么会导致慢查询。


(1)未命中索引


SQL 查询慢的原因之一是可能未命中索引,关于使用索引为什么能使查询变快以及使用时的注意事项,网上已经很多了,这里就不多赘述了。


(2)脏页问题


另一种还是我们上边所提到的刷脏页情况,只不过和写操作不同的是,是在读时候进行刷脏页的。


是不是有点懵逼,别急,听我娓娓道来:


为了避免每次在读写数据时访问磁盘增加 IO 开销,Innodb 存储引擎通过把相应的数据页和索引页加载到内存的缓冲池(buffer pool)中来提高读写速度。然后按照最近最少使用原则来保留缓冲池中的缓存数据。


那么当要读入的数据页不在内存中时,就需要到缓冲池中申请一个数据页,但缓冲池中数据页是一定的,当数据页达到上限时此时就需要把最久不使用的数据页从内存中淘汰掉。但如果淘汰的是脏页呢,那么就需要把脏页刷到磁盘里才能进行复用。


你看,又回到了刷脏页的情况,读操作时变慢你也能理解了吧?

防患于未然

知道了原因,我们如何来避免或缓解这种情况呢?


首先来看未命中索引的情况:


不知道大家有没有使用 Mysql 中 explain 的习惯,反正我是每次都会用它来查看下当前 SQL 命中索引的情况。避免其带来一些未知的隐患。


这里简单介绍下其使用方式,通过在所执行的 SQL 前加上 explain 就可以来分析当前 SQL 的执行计划:



执行后的结果对应的字段概要描述如下图所示:



这里需要重点关注以下几个字段:?


1、type


表示 MySQL 在表中找到所需行的方式。其中常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL 这些类型从左到右,性能逐渐变好。


  • ALL:Mysql 遍历全表来找到匹配的行;?

  • index:与 ALL 区别为 index 类型只遍历索引树;?

  • range:只检索给定范围的行,使用一个索引来选择行;?

  • ref:表示上述表的连接匹配条件,哪些列或常量被用于查找索引列上的值;?

  • eq_ref:类似 ref,区别在于使用的是否为唯一索引。对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者 unique key 作为关联条件;?

  • const、system:当 Mysql 对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于 where 列表中,Mysql 就能将该查询转换为一个常量,system 是 const 类型的特例,当查询的表只有一行的情况下,使用 system;?

  • NULL:Mysql 在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。


2、possible_keys?


查询时可能使用到的索引(但不一定会被使用,没有任何索引时显示为 NULL)。


3、key


实际使用到的索引。


4、rows


估算查找到对应的记录所需要的行数。


5、Extra


比较常见的是下面几种:?


  • Useing index:表明使用了覆盖索引,无需进行回表;

  • Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


同一个索引的部分的时候,表示 mysql 服务器将在存储引擎检索行后再进行过滤;?


  • Using temporary:表示 MySQL 需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by,order by;

  • Using filesort:当 Query 中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”。?


对于刷脏页的情况,我们需要控制脏页的比例,不要让它经常接近 75%。同时还要控制 redo log 的写盘速度,并且通过设置 innodb_io_capacity 参数告诉 InnoDB 你的磁盘能力。

总结

写操作?


  • 当 redo log 写满时就会进行刷脏页,此时写操作也会终止,那么 SQL 执行自然就会变慢。?

  • 遇到所要修改的数据行或表加了锁时,需要等待锁释放后才能进行后续操作,SQL 执行也会变慢。


读操作


  • 读操作慢很常见的原因是未命中索引从而导致全表扫描,可以通过 explain 方式对 SQL 语句进行分析。?

  • 另一种原因是在读操作时,要读入的数据页不在内存中,需要通过淘汰脏页才能申请新的数据页从而导致执行变慢。

最后

大家看完有什么不懂的可以在下方留言讨论.谢谢你的观看。觉得文章对你有帮助的话记得关注我点个赞支持一下!


作者:?IT 界农民工链接:https://www.cnblogs.com/caoyier/p/14172464.html

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
SQL:我为什么慢你心里没数吗?,java面试说我基础太差