gpt4 book ai didi

MySQL:如何使用 2 个连接和 1 个子查询提高选择查询的速度

转载 作者:行者123 更新时间:2023-11-29 03:07:56 24 4
gpt4 key购买 nike

在“ttraces”表中,我有许多不同任务的记录(其值保存在“taskid”列中,并且是“ttasks”表中“id”列的外键)。每个任务每 8-10 秒向“ttraces”插入一条记录,因此缓存数据以提高性能并不是一个好主意。我需要的是仅从“ttraces”中为每个任务选择最新记录,这意味着具有“时间”列最大值的记录。目前,我的表中有超过 500000 条记录。这两个表的非常简化的结构如下所示:

-----------------------
| ttasks |
-----------------------
| id | name | blocked |
-----------------------

---------------------
| ttraces |
---------------------
| id | taskid | time |
---------------------

我的查询如下所示:

SELECT t.name,tr.time
FROM
ttraces tr
JOIN
ttasks t ON tr.itask = t.id
JOIN (
SELECT taskid, MAX(time) AS max_time
FROM ttraces
GROUP BY itask
) x ON tr.taskid = x.taskid AND tr.time = x.max_time
WHERE t.blocked

WHERE 和 JOIN 子句中使用的所有列都已建立索引。至于现在,查询运行约 1.5 秒。提高它的速度是极其重要的。感谢所有建议。顺便说一句:数据库在托管的共享服务器上运行,我暂时无法将其移动到其他任何地方。

[编辑]EXPLAIN SELECT... 结果是:

--------------------------------------------------------------------------------------------------------------
id select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 74
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 x.taskid 1 Using where
1 PRIMARY tr ref taskid,time time 9 x.max_time 1 Using where
2 DERIVED ttraces index NULL itask 5 NULL 570853
--------------------------------------------------------------------------------------------------------------

引擎是 InnoDB。

最佳答案

我可能有一点时间,但这个查询在逻辑上不一样,而且(几乎可以肯定)更快吗?

SELECT t.id, t.name,max(tr.time)
FROM
ttraces tr
JOIN
ttasks t ON tr.itask = t.id
where BLOCKED
group by t.id, t.name

关于MySQL:如何使用 2 个连接和 1 个子查询提高选择查询的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600301/

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