在我们的网站宕机期间,我们在MySQL慢查询日志中观察到许多SQL:> 100秒,具有长Lock_time的查询很简单(以下是从慢查询日志复制的)。
SET timestamp=1599242815;
select `user`.`first_name`, `user`.`last_name`, `user`.`email` from `user` where `user`.`user_id` = <>;
# Time: 2020-09-04T18:13:12.674309Z
# User@Host: <>[<>] @ [<>] Id: 2128691
# Query_time: 359.872340 Lock_time: 223.442795 Rows_sent: 1 Rows_examined: 1user_id是这个表的自动生成的主键(unsigned int)。慢查询日志中的所有其他SQL都是相似的(通过PrimaryKey直接访问)
在慢查询日志中发现的查询是随机的(不特定于特定的表组)。此时没有其他长时间运行的高行扫描查询,也没有特别长时间运行的写事务。
下面是我们在performance_insights中找到的内容

我们如何找出trx_sys_mutex上的等待突然激增的原因?在过去5年的行动中,我们从未见过这样的行为。
AWS RDS: 32核心机器上的MySQL 8.0.19,使用innodb引擎处理表格。图中显示的时间为IST,RDS自动备份窗口比事件时间早10小时
发布于 2020-09-08 22:31:19
SELECT查询不需要任何行锁,除非您使用事务隔离级别SERIALIZABLE。所以它只能是一个元数据锁。每个查询都需要一个元数据锁,这可以被持有该元数据锁的任何其他会话阻塞。例如,任何ALTER/DROP/TRUNCATE/RENAME TABLE语句或LOCK TABLES。
我还看到Query_time是6分钟(359.87秒),其中超过2分钟是在锁等待完成之后。
我假设user.user_id是那个表的主键?因此,它通过主键查找单行,并花费了几分钟的时间?要花这么长时间,这是不可能的。
根据我的经验,只有当主机变得没有响应时,才会发生这种情况。它与您的SQL查询无关。
我会考虑其他的可能性:
您是否可以再次运行相同的查询,在相同的RDS实例上搜索相同的表以查找相同的值,并且只需要很少的时间?这将指向主机上的临时问题,而不是您的查询的问题。
正如我所说的,任何查询都需要一个元数据锁。必须获取这个锁,这意味着需要非零量的代码来检查元数据锁是否存在,从而阻止您的查询。通常这是如此之快,以至于你永远不会注意到它,但是如果主机超载到正常操作需要几分钟,甚至这种元数据锁定的快速检查也可能延伸。
https://stackoverflow.com/questions/63765524
复制相似问题