J'ai une grande table contenant plus de 10 millions d'enregistrements et elle continuera à grandir. J'effectue une requête d'agrégation (nombre de valeur particulière) sur les enregistrements des dernières 24 heures. Le temps pris par cette requête continuera à augmenter avec le nombre d'enregistrements dans la table.Conserver le sous-ensemble d'enregistrements séparément pour les performances de requête mysql
Je peux limiter le temps pris en conservant ces enregistrements de 24 heures dans une table séparée et effectuer l'agrégation sur cette table. Est-ce que mysql fournit des fonctionnalités pour gérer ce type de scénario?
Tableau schéma et requête pour référence:
CREATE TABLE purchases (
Id int(11) NOT NULL AUTO_INCREMENT,
ProductId int(11) NOT NULL,
CustomerId int(11) NOT NULL,
PurchaseDateTime datetime(3) NOT NULL,
PRIMARY KEY (Id),
KEY ix_purchases_PurchaseDateTime (PurchaseDateTime) USING BTREE,
KEY ix_purchases_ProductId (ProductId) USING BTREE,
KEY ix_purchases_CustomerId (CustomerId) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
select COALESCE(sum(ProductId = v_ProductId), 0),
COALESCE(sum(CustomerId = v_CustomerId), 0)
into v_ProductCount, v_CustomerCount
from purchases
where PurchaseDateTime > NOW() - INTERVAL 1 DAY
and ( ProductId = v_ProductId
or CustomerId = v_CustomerId);
Répondu mais après avoir relu votre question, peut-être qu'une forme de partition fournirait une solution strictement basée sur une table. Cela nécessiterait une analyse comparative de toutes les alternatives, car je ne suis pas sûr des implications de performance au sommet de ma tête. Voir cette réponse pour d'autres conseils: https://stackoverflow.com/questions/12200359/how-to-partition-mysql-table-by-day –