簡體   English   中英

跨多行優化MySQL查詢

[英]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

您有很多子查詢,看起來您可以看一下有關JOIN的一些文檔 它們真的很有用。

或者,您可以嘗試以下方法。 讓我知道這個使用隱式三聯票價的版本和上面建議的使用顯式三聯票價的版本。 謝謝。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM