gpt4 book ai didi

MySQL MAX() 运行很慢

转载 作者:行者123 更新时间:2023-11-30 21:28:17 28 4
gpt4 key购买 nike

我正在运营一个网站,该网站允许用户抓取和分析他们的 Instagram 竞争对手/个人帐户,以监控他们的成长并了解事情的进展情况以及他们是否正在实现他们的成长目标。

对于网站的这个特定部分,我的一个 MySQL 查询运行得非常慢(每次 4-6 秒)。

我有两个表:- myaccounts(存储每个用户正在跟踪的所有帐户)- 账户(存储所有原始数据。每个账户每 2 小时扫描一次,并在此处添加一条新记录)

这是运行非常慢的查询:

SELECT M.type, M.status, M.id as masterid, A.*
FROM myaccounts as M
INNER JOIN accounts as A on M.accountid = A.userid
WHERE A.id = (
SELECT MAX(id)
FROM accounts
WHERE userid = M.accountid)
AND M.userid = ?
AND M.status = 'active'

使用 EXPLAIN 表明子查询实际上遍历了表中的每一行(到目前为止大约 180k)。

我使用 MAX(id) 的原因是我想在主页上显示帐户的最新数据,并为用户提供在另一个页面上访问所有原始数据的选项。

有什么办法可以加快速度吗? MAX() 上的某种索引?

谢谢! :)

标记

最佳答案

不幸的是,您将无法在字段的 MAX() 上创建索引,因为它是一个必须在运行时计算的值。您可以这样做的唯一方法是维护一个存储最大值的新字段并在其上放置一个索引。但是,您需要确保每次运行可能更改其值的查询时更新该字段。这将解决您的性能问题,但通常不建议像这样复制数据,因为新字段始终存在与其余数据不同步的风险。

与其这样做,我建议取消子查询并使用 ORDER BY 按 accounts.id 对完整结果进行排序。然后,在查询末尾使用 LIMIT 1 来选择最靠前的结果。更具体地说,查询看起来像这样:

SELECT M.type, M.status, M.id as masterid, A.*
FROM myaccounts as M
INNER JOIN accounts as A on M.accountid = A.userid
WHERE M.userid = ?
AND M.status = 'active'
ORDER BY A.id DESC
LIMIT 1

关于MySQL MAX() 运行很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com