2016-10-13 2 views
0

Je voudrais permettre aux utilisateurs de trier les vidéos par "les plus vues" par période (jour, semaine, mois, année, etc.).Tri par agrégat sur un grand ensemble de données en temps réel

Actuellement, toutes les données sont dans MySQL et, fondamentalement, l'installation est une table "videos", et une table "views" qui contient des lignes avec une video_id, session_id et une colonne datetime.

Pour trier par "le plus regardé" un champ calculé est généré pour chaque vidéo avec COUNT() qui compte toutes les lignes de vue dans la période spécifiée. Cela fonctionne bien pour des périodes comme "heure" et "jour" pour l'instant, mais des périodes comme "mois" et "année" peuvent prendre beaucoup de temps.

Le problème est que ceci n'est pas évolutif. J'ai des milliers de vidéos et la plupart des vidéos génèrent des milliers de vues chaque mois, ce qui représente des millions de vues chaque mois.

Je demande une solution/stratégie générale évolutive. Est-ce que ce genre de choses est faisable dans MySQL ou dois-je considérer une base de données différente?

Répondre

0

Pour les statistiques d'utilisation (ou logs) des données de la stratégie d'agrégation suivante peut être utilisé:

  • précalculer les agrégats avant une certaine période (disons, sans compter « aujourd'hui »). Les serveurs OLAP peuvent le faire, mais bien sûr, vous pouvez le faire de manière plus simple avec du code personnalisé si vous n'avez pas besoin d'une solution générique. Ces agrégats doivent être recalculés à la fin de la période (par exemple, en début de journée).
  • Pour obtenir des résultats réels en temps réel, vous devez effectuer l'agrégation uniquement pour "aujourd'hui". Cela fonctionnera rapidement, mais si vous avez beaucoup de visiteurs, vous pouvez également mettre cette agrégation en cache pour une courte période de temps (par exemple, plusieurs secondes).
  • lorsque vous devez sélectionner « les plus vues » les résultats, vous devez combiner des agrégats pré-calculées (par toutes les statistiques avant aujourd'hui) et les fusionner avec les statistiques aujourd'hui regroupées dans le temps réel

En fonction de votre besoins et exigences, cette stratégie peut être utilisée soit sur la couche de base de données (vous pouvez créer une procédure stockée qui pré-calculera les agrégats et les enregistrer dans une table temporaire spéciale) soit au niveau de l'application (ou les deux).