MySQL MAX() 运行很慢

标签 mysql performance max greatest-n-per-group

我正在运营一个网站,该网站允许用户抓取和分析他们的 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/

相关文章:

mysql - CodeIgniter:在数据库中存储图像?

php - Phalcon PHQL GROUP BY 错误

MySQL触发器函数(3个不同表之间)

java - Hibernate 可以在性能敏感的应用程序中使用吗?

MySQL - #1005 - 无法创建表 'university.Enrolment'(错误号 : 150) (Details…))

html - 将 Google 字体代码放在 <head> 的什么位置以获得最大效率?

performance - 奇怪的 get 优化行为

SQL : SELECT w/MAX() and GROUP BY 的 Python 等效项

mysql - 优化 SELECT {OTHER_COLUMNS} IN MAX....GROUP BY 语句

sql-server - T-SQL 选择条件连接