mysql - MySQL 查询的最大 CPU 使用率和超过 60 秒的执行

标签 mysql sql linux left-join cpu-usage

当我第一次进行此查询并且表相对较小时,它运行得非常快,但随着时间的推移,随着更新表大小的增加(现在大约 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/

相关文章:

linux - 大内存页和碎片

linux - 从下面的 Shell 脚本中查找哪个文件有问题

mysql - 如何在 MySQL 中将变量中存储的值写入 CSV

php - 在不使用数组的情况下使用json从数据库中获取数据

mysql - MariaDB/MySQL RANK() 实现

c# - 从 RESTORE LABELONLY 操作中检索值

linux - Fstab 挂载错误 "mount: unknown filesystem type ' gid=33'

php - HY093 : Wrong number of parameters - positional

Python MySql 查询默默失败

java - Having 或 Where 子句中的 BigQuery RANK()