为什么我们的 AWS Aurora RDS 会出现峰值和锁定?

为什么我们的 AWS Aurora RDS 会出现峰值和锁定?

今天早上,我们的 aurora mysql serverless 2 出现峰值并基本锁定。我们有一个与集群关联的写入器/读取器和一个读取器。

在阅读器上,我们有一个密集的选择查询。这是 RDS 显示的查询(字段名称已更改),重点是它有多个 FIND_IN_SET 函数,洞察显示它检查了 109826.50 行。

SELECT thisstuff( thistime) AS thestuff, COUNT ( * ) AS count FROM mytable WHERE todo= ? AND someID= ? AND ( ( FIND_IN_SET( otherID, ? ) ) || ( FIND_IN_SET( otherID, ? ) ) || ( FIND_IN_SET( otherID, ? ) ) ) AND ( thistimeBETWEEN ? AND ? ) AND some_status= ? GROUP BY months_todo( thistime)

与此同时,我们的作家还在等待以下的事情。

等待/io/redo_log_flush
同步/sxlock/innodb/hash_table_locks
等待/io/table/sql/handler

有人能帮我理解为什么会发生这种情况吗?是写入器锁定了表还是 FIND_IN_SET 锁定了写入器?写入器在查询进行时正在更新同一张表。有没有办法防止这种情况发生?

谢谢

答案1

SELECT  thisstuff ( thistime ) AS thestuff , COUNT ( * ) AS count
    FROM  mytable
    WHERE  todo = ?
      AND  someID = ?
      AND  ( ( FIND_IN_SET ( otherID , ? ) ) ||
             ( FIND_IN_SET ( otherID , ? ) ) ||
             ( FIND_IN_SET ( otherID , ? ) ) 
           )
      AND  ( thistime BETWEEN ? AND ? )
      AND  some_status = ?
    GROUP BY  months_todo ( thistime )

让我们尝试让查询运行得更快。

INDEX(someID, status, todo, thistime)

有助于。

如果对 otherID 的测试是单个值,这是否也能正常工作(并且速度更快)?

AND otherID IN ( ?, ?, ? )

如果有列表,那么如何

AND otherID IN CONCAT_WS(',', ?, ?, ?)

什么是months_todo?如果它是一个函数,让我们看看它。它看起来也像是thissstuff(...)一个函数;让我们看看它。

相关内容