J'ai un jeu en ligne où j'écris beaucoup de statistiques de jeu. Ces tables de statistiques deviennent très rapidement très volumineuses, et je dois faire attention car il suffit d'enregistrer plus de statistiques pour que les performances du jeu soient assez mauvaises, une fois que la table sera suffisamment grande. Ma stratégie, qui n'est pas très bonne, est de garder les tables de statistiques petites. J'ai un processus automatique qui crée une nouvelle table toutes les 24 heures, empêchant la performance d'être trop incontrôlable. Mais ma solution est moche et est une sorte de "rotation" des tables de statistiques. J'utilise innodb et j'ai mis en place quelques index pour améliorer les performances, et puis je garde juste 30 de ces tables (chacune étant de 24 heures, donc j'enregistre un mois de stats). Toutes les 24 heures, mon processus automatisé supprime la table "stats30", puis renomme toutes les tables numérotées pour en avoir un plus grand nombre, puis crée une nouvelle table vierge appelée simplement "stats". C'est la table "live", où les statistiques sont activement enregistrées.MySQL idée de "rotation" de gros volume de statistiques?
Ces tables enregistrent fondamentalement chaque transaction entre chaque joueur et chaque autre joueur dans le jeu avec lequel elles interagissent, donc une explosion exponentielle des données. Lorsqu'une nouvelle transaction se produit, elle vérifie s'il existe déjà une ligne pour les transactions entre ces deux joueurs au cours de cette journée. Si c'est le cas, il met à jour la ligne avec les modifications apportées à leurs transactions. Sinon, il crée une nouvelle ligne. Une paire de joueurs qui interagissent 1000 fois dans une journée et une paire qui interagissent une seule fois n'auront qu'une seule rangée dans la table pour ce jour. Chaque action sur la base de données implique un SELECT puis un UPDATE ou un INSERT, de sorte qu'il est assez même entre les lectures et les écritures telles qu'elles sont actuellement conçues. La lecture de données dans un sens plus large, c'est-à-dire pour l'analyse de statistiques et de joueurs multiples, est faite très rarement, par rapport aux SELECT, UPDATEs et INSERTs uniques. Il y a environ 150 000 lignes créées par jour.
Je sais que cela pourrait être mieux. Je ne peux pas facilement réduire la quantité de données que j'enregistre, mais je suis préoccupé par 1.performance, et 2.simplicity. Je pourrais encore augmenter les performances en créant une nouvelle table toutes les 4 heures, par exemple, mais je devrais jouer avec 180 tables. Inversement, je pourrais le rendre plus simple en n'utilisant qu'une seule table, et tout s'arrêterait. Notez que j'ai besoin de mettre à jour des lignes dans ces tables, donc je ne peux pas utiliser quelque chose comme le moteur de stockage ARCHIVE, mais j'ai seulement besoin de INSERT ou UPDATE sur la table de statistiques "live".
Il y a aussi le problème mineur que lorsque le processus de rotation quotidienne se produit, toutes les requêtes arrivant à ce moment peuvent être perdues. (S'il est en train de renommer toutes les tables et en créer une nouvelle, les nouvelles entrées peuvent échouer.) Perdre quelques insertions n'est pas un gros problème, mais une solution où cette erreur ne se produira pas ou pourrait être faite "atomiquement". " serait mieux.
Merci pour toutes les idées qui pourraient aider! :)
Combien de rangs avez-vous par jour? Sont-ils lus une fois lus plusieurs fois? Par exemple, une fois que vous écrivez une ligne dans la base de données, est-ce qu'elle est mise à jour? – idrosid
Je suis assez sceptique que la performance de MySQL est le vrai goulot d'étranglement ici. – Pesto
On dirait que vous créez un énorme gâchis. Vous devriez totalement laisser tomber cela et utiliser JQUERY! – belgariontheking