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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top