[英]Optimizing MySQL query across multiple rows
我當前的查詢看起來像這樣。 我一直在嘗試優化它,但到目前為止我還沒有運氣。 我的目標是獲取每個玩家在當前日期和前一天之間的stat_value差異,然后對其進行排序。 當前的代碼工作正常,但對我來說卻沒有優化。 ? 值使用Java填寫。
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
提前致謝
由於您只有2天的時間,因此可以對leaderheadsplayersdata_daily
表進行兩次leaderheadsplayersdata_daily
。
它看起來像這樣:
SELECT
p.player_id,
p.name,
(dc.stat_value-dp.statvalue) AS difference,
dc.day,
FROM leaderheadsplayers p
JOIN leaderheadsplayersdata_daily dc ON p.player_id = dc.player_id
JOIN leaderheadsplayersdata_daily dp ON p.player_id = dp.player_id and dp.day = (dc.day-1)
WHERE dc.day = ?CURRENT_DAY?
ORDER BY difference DESC
dc
代表“日期電流”。 dp
代表“上一個日期”。 p
代表“玩家”。
為了獲得良好性能,請在player_id
(在兩個表中)和day
列上添加索引。
抱歉,我沒有測試,如果我有語法錯誤或其他東西,還沒有想法。 另外,請替換?CURRENT_DAY?
與實際日期並根據需要在WHERE
子句中添加其他條件
如果ORDER BY difference DESC
不起作用,則只需執行ORDER BY (dc.stat_value-dp.statvalue) DESC
。
或者,您可以嘗試以下方法。 讓我知道這個使用隱式三聯票價的版本和上面建議的使用顯式三聯票價的版本。 謝謝。
SELECT t3.player_id, improvement FROM
(SELECT t1.player_id as player_id, (t1.stat_value - t2.stat_value) as improvement
FROM leaderheadsplayersdata_daily t1 INNER JOIN leaderheadsplayersdata_daily t2
on t1.player_id = t2.player_id and t1.stat_type = t2.stat_type
and t2.day = ? and t1.day = ?) as t3
INNER JOIN leaderheadsplayers on
t3.player_id = leaderheadsplayers.player_id
ORDER BY improvement DESC LIMIT 100;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.