我有一个现在有 1200 万条记录的 mysql 表,我正在尝试使用以下 UPDATE 代码更新列(排名):
SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC;
Run Code Online (Sandbox Code Playgroud)
几乎每分钟都会插入新行。所以,一小时后,我有几行没有排名,我需要再次更新整个表格。
然而,这需要太多时间。有什么优化方法或不同的方法来更快地更新表吗?也许是一种不同的方法?分区表?
反问:您真的需要对所有 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;
Run Code Online (Sandbox Code Playgroud)
我会在午夜运行您的原始查询以获取全部内容
如果你必须尝试对所有内容进行排名,也许你可以尝试这样的事情:
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;
Run Code Online (Sandbox Code Playgroud)
records
可能进一步帮助的是像这样索引你的表:
ALTER TABLE records ADD INDEX type_seconds_ndx (type,seconds);
Run Code Online (Sandbox Code Playgroud)