Mysql

在大表上更新排名

  • January 18, 2022

我有一個 mysql 表,現在有 1200 萬條記錄,我正在嘗試使用以下 UPDATE 程式碼更新列(排名):

SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC;

幾乎每分鐘都會插入新行。所以,一小時後,我有幾行沒有排名,我需要再次更新整個表。

但是,這需要太多時間。有什麼方法可以優化或更快地更新表嗎?也許是不同的方法?分區表?

反問:你真的需要對所有 12,000,000 條記錄進行排名嗎?

在我雇主的網路託管公司,我們有一個遊戲客戶端,它對每個遊戲平台的前 10,000 名玩家進行排名。他們使用與您相同的構造。您應該將其限制在前 10,000 名或任何合理的數字

SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC LIMIT 10000;

我會在午夜執行您的原始查詢以獲取所有資訊

如果您必須嘗試對所有內容進行排名,也許您可以嘗試以下操作:

DROP TABLE IF EXISTS ranktable;
CREATE TABLE ranktable
(
   rank INT NOT NULL AUTO_INCREMENT,
   rec_id INT NOT NULL,
   PRIMARY KEY (rank)
);
INSERT INTO ranktable (rec_id)
SELECT rec_id FROM records WHERE type=2 ORDER BY seconds DESC;
UPDATE records A INNER JOIN ranktable B USING (rec_id) SET A.rank = B.rank;

可能進一步的幫助是records像這樣索引您的表:

ALTER TABLE records ADD INDEX type_seconds_ndx (type,seconds);

引用自:https://dba.stackexchange.com/questions/18987