我目前的查询看起来像这样。我一直在试图优化它,但到目前为止我还没有运气。 我的目标是让每个玩家获得当日和前一天之间stat_value的差异,然后对其进行排序。 目前的代码工作正常,但我觉得没有优化。 The?值使用Java填充。跨多行优化MySQL查询
SELECT t1.stat_value -
(SELECT stat_value
FROM leaderheadsplayersdata_daily t2
WHERE t2.player_id = t1.player_id
AND t2.day = ?
AND t2.stat_type = ?
LIMIT 1
) as sum
, (SELECT name
FROM leaderheadsplayers
WHERE leaderheadsplayers.player_id = t1.player_id
LIMIT 1
)
FROM leaderheadsplayersdata_daily t1
WHERE day = ?
AND stat_type = ?
ORDER
BY sum DESC LIMIT 100
表结构:
这是包含玩家ID和用户名的主表。
CREATE TABLE IF NOT EXISTS `leaderheadsplayers`
(player_id INTEGER PRIMARY KEY AUTO_INCREMENT
,uuid VARCHAR(36) NOT NULL UNIQUE
,name VARCHAR(16) NOT NULL
,last_join DATETIME
) ENGINE = InnoDB
这是包含日常数据的表格。
CREATE TABLE IF NOT EXISTS leaderheadsplayersdata_daily
(player_id INTEGER NOT NULL
,stat_value DOUBLE NOT NULL
,stat_type VARCHAR(16) NOT NULL
,day INTEGER NOT NULL
,FOREIGN KEY (player_id) REFERENCES leaderheadsplayers(player_id) ON DELETE CASCADE
,PRIMARY KEY(player_id, stat_type, day)
) ENGINE = InnoDB
在此先感谢
描述你的表格结构将有助于建议回答 – evilpenguin
新增数据库结构。 –
你能提供在查询中使用EXPLAIN的输出吗? – ultrajohn