当我第一次进行此查询并且表相对较小时,它运行得非常快,但随着时间的推移,随着更新表大小的增加(现在大约 6000 行),查询变得非常慢并且占用大量资源。我使用的服务器是 linode.com 的 1GB RAM VPS,实际上我没有等待足够长的时间来完成查询。
有趣的是,如果左连接 (SELECT MAX(u2.time)) 中没有额外的条件,它的运行时间将小于 0.5 秒。
我在查询运行时查看了mySQL的进程列表,它一直显示为“正在发送数据”
这是查询:
SELECT
s.ID as sid, s.country AS country,
s.name AS name, s.ip AS ip,
u.connPlayers AS cp, u.maxPlayers AS mp
FROM servers AS s
LEFT JOIN updates AS u
ON u.serverID = s.ID
AND u.time =
(SELECT MAX(u2.time)
FROM updates AS u2
WHERE u2.serverID = s.ID)
ORDER BY RAND(MINUTE(NOW()))
LIMIT 0,10
这是 my.cnf 文件:http://redream.co.nz/my.cnf
表结构:
服务器表(20 行 )
Field Type
ID int(10) Unique Key
ip varchar(200)
country varchar(2)
name varchar(600)
motd varchar(600)
desc mediumtext
version varchar(600)
更新表格(6000 行)
Field Type
serverID int(10)
ping int(10)
time int(14)
uptime int(10)
connPlayers int(10)
maxPlayers int(10)
uptime int(14)
最佳答案
正在为更新
和服务器
的叉积的每一行运行子查询Select MAX(...
/strike>服务器
和更新
的叉积,然后再次更新
。MySQL的优化器不是很复杂。
更新:我的 SQL 有点生疏,但你可以尝试这样的事情:
SELECT
/* blah */
FROM
servrs s
LEFT JOIN
updates u
ON
u.serverID = s.ID
GROUP BY s.serverID
HAVING MAX(u.time)
我手头没有 MySQL 实例,因此您可能需要稍微调整一下才能使其正常工作。
Update2:仔细查看代码后,我认为这个查询的成本比我最初的估计要大。更新了这个答案的顶部。
关于mysql - MySQL 查询的最大 CPU 使用率和超过 60 秒的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973573/