Classement de mise à jour sur une grande table
Question
J'ai une table mysql qui a maintenant 12 millions de disques et je suis en train de mettre à jour une colonne (rang) avec le code UPDATE suivant:
SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC;
Presque chaque minute de nouvelles lignes sont insérées. Donc, au bout d'une heure, j'ai plusieurs lignes non classés et je dois mettre à jour à nouveau la table.
Cependant, il prend trop de temps. Est-il possible d'optimiser ou d'une autre façon de mettre à jour la table plus rapide? Peut-être une approche différente? Partitionner la table?
La solution
Question Rhétorique: Est-ce que vous avez vraiment besoin de classer tous les enregistrements 12.000.000
A mon société d'hébergement Web de l'employeur , un client de jeu qui se classe son sommet 10.000 joueurs par plate-forme de jeu. Ils utilisent la même construction que vous faites. Vous devez juste limiter au sommet 10.000 ou peu importe le nombre est raisonnable
SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC LIMIT 10000;
Je courrais votre requête initiale à minuit pour les obtenir tous
Si vous devez essayer de classer tous, peut-être vous pouvez essayer quelque chose comme ceci:
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;
Ce qui peut encore l'aide est à indexer votre table records
comme ceci:
ALTER TABLE records ADD INDEX type_seconds_ndx (type,seconds);