前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白学习MySQL - 一次慢SQL的定位

小白学习MySQL - 一次慢SQL的定位

作者头像
bisal
发布2021-11-25 09:23:54
3490
发布2021-11-25 09:23:54
举报

同事提了个问题,某套测试环境MySQL执行语句出现hang。

作为小白,每次碰到问题,都是在积累经验。执行SQL出现hang,说明应该有会话处于等待状态,可以通过show processlist看下当前的一些会话信息。

show processlist的敏感信息太多了,不截图了,现象是很多waiting for table level lock select ...、query end update ...。

首先看下系统负载的情况,top显示资源还是比较繁忙的,

e8cfe6c3b4c53ecc4f1ac9ef84710700.png
e8cfe6c3b4c53ecc4f1ac9ef84710700.png

磁盘读写不低,

5c23783e501f93cb87ee7cfc521b3eaa.png
5c23783e501f93cb87ee7cfc521b3eaa.png

再看下磁盘空间,/var路径已经满了,

ceb7bd5f516d191a3251faaaf43ff399.png
ceb7bd5f516d191a3251faaaf43ff399.png

经过沟通,MySQL的binlog放到了/var下,磁盘空间满了,不能写日志了,按照日志优先写的机制,不能操作数据库,这是正常现象。

从规范上,MySQL的binlog放到/var系统路径,并不是很合理,因为是测试环境,可能就很随意了,为了解决问题,先清理下路径。从截图来看,/var中有很多docker的镜像,了解了下,很多都是不用的镜像了,

585267a76b5b2e8e441b5ee97889ec48.png
585267a76b5b2e8e441b5ee97889ec48.png

删除无用的,释放出/var的空间,

代码语言:javascript
复制
docker rm 容器ID
docker rmi 镜像

此时数据库可以访问执行了,但是操作某张表,非常地慢,执行一条普通SQL,例如select * from test where cid='1';,cid存在索引,数据量是8千万,cid是int类型,执行计划如下,没有隐式转换,

a4bb651525012caea3f38429bb6f4ad7.png
a4bb651525012caea3f38429bb6f4ad7.png

按说应该毫秒出,但是都需要几秒,而且奇怪的是,即使执行explain,都需要几秒。这种情况,不应该只是这条语句的问题。

show processlist还是显示很多waiting for table level lock select ...,关于行锁的定位,可以参考《InnoDB快速定位行锁争用会话的过程和操作》,但这里提示的是表锁,而且是select等待表锁,再看下这张表的创建语句,他是按照ENGINE=MyISAM创建的,这就能解释了。

MyISAM引擎的锁粒度,是Table,读锁和写锁,是互斥的,就是说读写操作是串行的,而且默认写的优先级高于读,看资料说,存在一些参数,可以调整优先级,这需要综合考量,无论怎样调整,总有一种操作,优先级降低,他对应的逻辑,就会有影响,可能更加复杂,因此MyISAM引擎,按照官方推荐,适合于查询频繁的场景,如果对数据的增删改频率很高,还是推荐使用InnoDB,他的锁粒度是Row,

19a3e12491e210ece987ab72b8bb51ca.png
19a3e12491e210ece987ab72b8bb51ca.png

https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

经过沟通,当前的时间段,有个落数的程序,一直在跑之前几天丢的数据,就是说当前有频繁的更新操作,语句简单,就是update test set ... where cid=...,但就像上面所说,MyISAM引擎用的表锁,而且默认写,优先级高于读,select只能在很多update穿插中执行,抢到了资源,才可以执行。

待落数的程序,执行完成,此时select就快了,因为无资源争用,都给读了。咨询了下,之所以定义为MyISAM,是认为他会让SQL执行更快,的确,MyISAM不支持事务,不会像InnoDB为了保证事务一致性,需要做些操作,而且MyISAM的数据定位和缓存上,和InnoDB有所区别,一定程度上,对检索效率,可能有所提升。但是究竟用什么样的引擎,不应该只看效率,还需要结合实际的场景,综合考量。如果在检索同时,存在高并发的增删改操作,就会像上面这种,影响select效率,原本要通过MyISAM获得更高响应时间就成为了空谈。

因此,任何技术的选型,都需要在充分了解技术原理的前提下,结合实际场景,综合考量,权衡利弊,我们追求的应该不是最佳的,应该是最合适的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档