我有一些类似于以下的 SQL:
select code, count(id) as count_total, count(distinct email) as
count_distinct
from submissions where page_id = ?
group by code order by count_total desc
这不是最快的查询,因为提交表很大,并且有很多可能的电子邮件和代码,但它不需要经常运行,所以没关系。
但我的问题是,由于某种原因,当该查询运行时,MySQL 似乎不接受新连接。现有连接可以很好地完成任务,但在完成之前不会建立新连接。连接太多也不是问题,我的 max_connections
太低了,无论连接数量是少还是多,都会发生这种情况。
我觉得我基本上已经将范围缩小到使用临时
,因为当我删除group by code
时,它不再需要临时表,它就没有这个问题。
当该查询运行时,什么会导致 MySQL 不接受新连接?如果重要的话,该服务器位于 AWS RDS 上。
最佳答案
我相信,因为 Group by 想要聚合数据库的值,所以它将获取相同的写锁,否则结果可能会不一致。理想情况下,MySQL 仍应接受读取请求。
您甚至可以锁定一堆行,而无需通过使用虚拟 GROUP BY 子句将它们分组在一起来获取任何数据。
SELECT 1 FROM sometable WHERE somecondition GROUP BY 1 FOR UPDATE;
关于MySQL 在运行使用临时的查询时不会建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163808/