MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Echtzeitstatistik:MySQL(/Drizzle) oder MongoDB?

Also verwendet BuddyMedia etwas davon. Die Gilt Groupe hat mit Hummingbird etwas ziemlich Cooles gemacht (node.js + MongoDB).

Da ich für einen großen Online-Werbetreibenden im Social-Media-Bereich gearbeitet habe, kann ich bestätigen, dass Echtzeit-Berichte wirklich mühsam sind. Der Versuch, 500 Millionen Impressionen pro Tag zusammenzufassen, ist bereits eine Herausforderung, aber der Versuch, dies in Echtzeit zu tun, funktionierte, brachte jedoch einige erhebliche Einschränkungen mit sich. (als wäre es tatsächlich um 5 Minuten verzögert worden :)

Ehrlich gesagt ist diese Art von Problem einer der Gründe, warum ich angefangen habe, MongoDB zu verwenden. Und ich bin nicht der einzige. Die Leute verwenden MongoDB für alle Arten von Echtzeitanalysen:Serverüberwachung , zentralisierte Protokollierung , sowie Dashboard-Berichte.

Der eigentliche Schlüssel bei dieser Art von Berichten besteht darin, zu verstehen, dass die Datenstruktur bei MongoDB völlig anders ist. Sie vermeiden „Aggregations“-Abfragen, sodass die Abfragen und die Ausgabediagramme unterschiedlich sind. Es gibt einige zusätzliche Codierungsarbeiten auf der Client-Seite.

Hier ist der Schlüssel, der Sie in die richtige Richtung weisen könnte, um dies mit MongoDB zu tun. Sehen Sie sich die folgende Datenstruktur an:

{
  date: "20110430",
  gender: "M",
  age: 1, // 1 is probably a bucket
  impression_hour: [ 100, 50, ...], // 24 of these
  impression_minute: [ 2, 5, 19, 8, ... ], // 1440 of these
  clicks_hour: [ 10, 2, ... ],
  ...
}

Hier gibt es offensichtlich einige Optimierungen, geeignete Indizes, vielleicht das Mushen von Daten + Geschlecht + Alter in eine _id . Aber das ist sozusagen die Grundstruktur der Klickanalyse mit MongoDB. Es ist wirklich einfach, Impressionen und Klicks { $inc : { clicks_hour.0 : 1 } } zu aktualisieren . Sie können das gesamte Dokument atomar aktualisieren. Und es ist eigentlich ziemlich natürlich, darüber zu berichten. Sie haben bereits ein Array, das Ihre Datenpunkte auf Stunden- oder Minutenebene enthält.

Hoffentlich weist Sie das in die richtige Richtung.