电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

性能分析--数据库--MySQL--快速定位SQL问题

来源:金蝶云社区作者:金蝶2024-09-238

性能分析--数据库--MySQL--快速定位SQL问题

1 简介

苍穹系统兼容各种数据库,包括MySQL,PostgreSQL,Oracle,SQL Server,达梦等数据库。数据库作为苍穹系统的核心组件,其稳定性和性能直接关系到苍穹系统的稳定和性能。

数据库出现问题90%是由于SQL语句导致的,具体表现为cpu使用率高,磁盘io压力大,数据库连接数暴涨,数据库出现锁等待等问题。

本期内容苍穹使用最广泛的MySQL数据库为例,教大家如何快速定位SQL问题。其他数据库思路类似。

2 定位SQL

2.1 找出执行时间最长的SQL

首先通过下述查询语句,找出执行时间最长的SQL。

select * from information_schema.processlist where Command<>'Sleep' order by time desc ;


一般情况下,我们关注查询出来的第一条数据。其执行时间超过30s,表示存在性能问题。

如果有很多执行时间长的SQL,并且这些SQL执行的时间都比较接近,一般是因为第一条sql导致数据库阻塞。临时办法是kill掉这个SQL请求,例如kill 285380,最终解决办法是对这个SQL分析优化,不然问题还是会反复出现。


2.2 找同类型并发SQL

然后再通过下述查询语句,找出同类型并发的SQL。

select * from information_schema.processlist where Command<>'Sleep' order by time desc;


同类型并发SQL是大量SQL语句完全一样,或者SQL主体一样,只是where后的条件值不同。这种并发SQL会导致数据库压力增加,连接数暴涨,性能下降,如果是update,delete会导致数据库阻塞。

出现这种问题一般都是程序中有大量循环操作导致解决办法是修改业务错误逻辑,减少SQL执行的并发量。


2.3 找阻塞和被阻塞SQL

以下是针对不同MySQL版本,进行查找阻塞和被阻塞SQL的语句。

MySQL5.7
########
select b.trx_mysql_thread_id as '被阻塞线程'
 ,b.trx_query as '被阻塞SQL'
 ,c.trx_mysql_thread_id as '阻塞线程'
 ,c.trx_query as '阻塞SQL'
 ,(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)) as '阻塞时间'
from
information_schema.innodb_lock_waits a
join
information_schema.innodb_trx b on a.requesting_trx_id=b.trx_id
join
information_schema.innodb_trx c on a.blocking_trx_id=c.trx_id


MySQL8.0
########
select t1.REQUESTING_THREAD_ID as '被阻塞线程'
,t2.trx_query as '被阻塞SQL'
,t1.BLOCKING_THREAD_ID as '阻塞线程'
,t3.trx_query as '阻塞SQL'
,(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(t3.trx_started)) as '阻塞时间'
from
(
   SELECT REQUESTING_THREAD_ID,REQUESTING_ENGINE_TRANSACTION_ID,BLOCKING_THREAD_ID,BLOCKING_ENGINE_TRANSACTION_ID
   FROM performance_schema.data_lock_waits
) t1
left join information_schema.innodb_trx t2 on t1.REQUESTING_ENGINE_TRANSACTION_ID=t2.trx_id
left join information_schema.innodb_trx t3 on t1.BLOCKING_ENGINE_TRANSACTION_ID=t3.trx_id


锁是数据库在并发情况下保证数据一致性的一种机制,正常情况下行记录持有锁的时间都非常短,不合理的事务处理就会导致锁的相互等待。这里重点讲一下"锁等待"和"死锁"的区别


 · 区别 · 

  1. "死锁"是锁等待形成回路,发生死锁马上会被innodb引擎检测出来,并且回滚其中的一个事务。而"锁等待“需要其中一个事务等待超过innodb_l

性能分析--数据库--MySQL--快速定位SQL问题

1 简介苍穹系统兼容各种数据库,包括MySQL,PostgreSQL,Oracle,SQL Server,达梦等数据库。数据库作为苍穹系统的核心组件,其稳定性和...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信