このクエリを最初に作成したとき、テーブルが比較的小さかったときは非常に高速に実行されましたが、時間の経過とともに更新テーブルのサイズが大きくなり (現在は約 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)