今天早上,我们的 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 ( thistime
BETWEEN ? 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(...)
一个函数;让我们看看它。