Mysql
 sql >> Base de données >  >> RDS >> Mysql

La requête MySQL SUM est extrêmement lente

(Oui, j'en ajoute un autre réponse. Justification :Il traite le problème sous-jacent d'une manière différente.)

Le problème sous-jacent semble être qu'il existe une table de "transaction" sans cesse croissante à partir de laquelle sont dérivées diverses statistiques, telles que SUM(amount) . Les performances de cela ne feront qu'empirer au fur et à mesure que la ou les tables grandissent.

La base de cette réponse consistera à examiner les données de deux manières :"Historique" et "Actuel". Transactions est l'Histoire. Une nouvelle table serait le Current totaux pour chaque utilisateur. Mais je vois plusieurs façons de le faire. Chacun implique une certaine forme de sous-totaux afin d'éviter d'ajouter 773 000 lignes pour obtenir la réponse.

  • La méthode bancaire traditionnelle... Chaque nuit, comptez les Transactions de la journée et ajoutez-les à Current .
  • La méthode de la vue matérialisée... Chaque fois qu'une ligne est ajoutée à Transactions , incrémente Current .
  • Hybride :conserver les sous-totaux quotidiens dans un "tableau récapitulatif". Additionnez ces sous-totaux pour obtenir le SUM jusqu'à hier soir.

Plus de discussion dans mon blog sur Tableaux récapitulatifs .

Notez que le solde à la seconde près pour le mode bancaire ou hybride est un peu délicat :

  1. Obtenir le montant de la nuit dernière
  2. Ajoutez toutes les transactions qui ont eu lieu au cours de la journée.

N'importe laquelle des approches sera beaucoup plus rapide que de scanner toutes les 773K lignes pour l'utilisateur, mais ce sera un code plus complexe.