Wir müssen grundlegende Informationen über 3 Millionen Produkte speichern. Derzeit handelt es sich um eine 180-MB-CSV, die vierteljährlich aktualisiert wird.
Es werden ungefähr 30.000 Abfragen pro Tag durchgeführt, aber die Abfragen sind nur ein sehr einfacher Schlüsselwertspeicher. Wir müssen nur die Produkt-ID nachschlagen und den Rest der Informationen anzeigen (die alle in einem Datensatz enthalten wären).
Dies gilt für das Web, daher ist eine schnelle Leistung von entscheidender Bedeutung.
Sollten wir MySQL verwenden, obwohl wir wirklich keine relationale Datenbank benötigen? Sollten wir nur 3 Millionen statische HTML-Dateien pro Quartal generieren? Sollten wir für jedes Produkt eine einzeilige CSV in Amazon S3- oder Rackspace Cloud-Dateien speichern? Was ist der beste Weg, dies zu tun?
Und jetzt etwas ganz anderes:
Gegeben:
Außerhalb der Box Lösung:
Speichern Sie jedes Produkt als TXT-Ressourceneintrag und speichern Sie es im DNS, z.
Leistungen:
Gründe, warum dies eine schlechte Idee sein könnte:
quelle
MySQL mit MyISAM und einigen guten Indizes klingt dafür perfekt. Natürlich gibt es viele andere Optionen, aber MySQL wird auf jedem kommerziellen Webhost sehr (wenn nicht universell) unterstützt. Abhängig von der Geschwindigkeit, die Sie benötigen, lohnt es sich möglicherweise auch , sich memcached anzusehen. Ohne die Größe jedes Schlüssel / Wert-Paares zu kennen, ist das Speichern von 3 Millionen davon im Speicher möglicherweise eine noch schlechtere Idee als eine 180-MB-CSV-Datei (oh, warte, das ist es eine 180-MB-CSV-Datei, damit wir wissen, wie groß sie sind. Es müssen ziemlich kleine Paare sein, damit Memcached noch besser sein kann.
Sie möchten keine 3 Millionen statischen HTML-Dateien, da dies Ihr Dateisystem stark schädigt. Eine einzeilige CSV wird auch unter S3 das gleiche Problem haben. Niemand möchte 3 Millionen Dateien in einem Ordner.
quelle
So you think MySQL is the way to go, really?
- nein, nicht wirklich, aber es ist sehr flexibel und wird, wie gesagt , fast universell unterstützt. LazyOne hat jedoch oben einige gute Alternativen veröffentlicht. Ich konnte mich nicht an den Begriff NoSQL erinnern, aber er schwebte irgendwo in meinem Gehirn herumSie können die Berkeley-Datenbank verwenden, die genau so etwas tut, auch wenn sie seit Beginn von Perl5 nicht mehr angesagt war. Berkeley unterstützt nur Schlüsselwertpaare, und Sie binden die gesamte Datenbank an einen Hash und greifen als solcher darauf zu.
Die Verwendung von Berkeley ist in vielen älteren Perl-Referenzen, die sich in Ihrem Regal befinden, oder im Perldoc für das BerkeleyDB-CPAN-Modul ausführlich beschrieben . Ich vermeide generell die Verwendung von Berkeley DB (obwohl mein Arbeitgeber viel alten Code hat, in dem er eine herausragende Rolle spielt, und einige der DBs so groß sind wie Ihre), weil es keinen Spaß macht, wenn Ihre Daten komplexer werden.
quelle
Sie haben Ihre Frage als Amazon S3 gekennzeichnet.
Ich möchte Ihre Aufmerksamkeit auf eines der anderen verwandten Produkte namens Amazon SimpleDB lenken.
Es klingt so, als würde das SimpleDB-Datenmodell gut zu Ihrer Art von Anwendung passen.
Dies ist kein Plug-in dafür, aber es lohnt sich, einen Blick darauf zu werfen, insbesondere wenn Sie die Amazon Cloud-Dienste nutzen möchten.
Das SDB-Datenmodell ähnelt einer Tabelle.
Weitere Informationen finden Sie hier: http://aws.amazon.com/simpledb/ Und das Datenmodell: http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/
quelle
Obwohl 180 MB Daten von jeder relationalen Datenbank problemlos verarbeitet werden können, würde ich MongoDB ( http://www.mongodb.org/) wärmstens empfehlen.) über MySQL, Redis, MemcacheDB und anderen einfacheren Schlüsselwertspeichern oder relationalen Datenbanken. Der Grund dafür ist, dass MongoDB für diese Art von Problem das schnellste und ausdrucksstärkste System ist und superschnelle dynamische Updates ohne Schemaeinschränkungen ermöglicht, sodass Ihre Dokumente unterschiedliche Formate haben können, wenn Sie dies möchten. Ich war neulich bei einer Präsentation von guardian.co.uk und sie haben eine politische Entscheidung getroffen, alle relationalen Datenbanken zu verbieten und MongoDB ausschließlich für die Bereitstellung ihrer Nachrichten zu verwenden. Sie können ein Gefühl dafür bekommen, wie schnell ihre Website ist und welche seit 1995 online ist (die älteste Online-Zeitung in Großbritannien). Sie haben in der Vergangenheit auch alle möglichen Engpässe aufgrund relationaler Datenbanken durchlaufen. Für 180 MB wird MongoDB alles aus dem In-Memory-Bereich bereitstellen, sodass Ladezeiten von weniger als ms wahrscheinlich der Fall sind.
quelle
Sie sagten, dass Ihre Abfragen nur einfache Schlüsselsuchen sind. Bei der binären Suche benötigen Sie im schlimmsten Fall 21 Iterationen. Bei gehashten Schlüsseln sind Ihre Abfragen sogar noch schneller. Drei Millionen Datensätze sind klein , solange Sie Verknüpfungen (oder andere kartesische Produktoperationen) und lineare Suchen vermeiden.
Ich würde sagen, dass so ziemlich alles gut gehen würde. Ihre Last beträgt 30000 Abfragen pro Tag. Dies bedeutet, dass Sie (vorausgesetzt, Ihre Last ist den ganzen Tag über konstant) alle 20 Sekunden eine einzige Abfrage haben. Das ist gar nicht so schlecht.
Ich würde empfehlen, zuerst die Technologie zu implementieren, mit der Sie am besten vertraut sind, und dann zu messen, ob dies wirklich der Engpass des Systems ist.
quelle
Der beste Weg, dies zu tun, hängt wirklich von der Qualität und Art Ihrer Daten und Abfragen ab. Für den Anfang sind 180 MB Daten in einer einzigen Tabelle für Produkte kein Problem, egal wie Sie es betrachten. Und 30.000 Anfragen pro Tag sind noch weniger ein Problem. Mit einer ordnungsgemäß konfigurierten Datenbank kann jeder alte Desktop diese Last verarbeiten.
Andere haben bereits auf Ihre beiden Hauptoptionen hingewiesen, MySQL oder eine noSQL-Datenbank.
Wenn Sie eine bestimmte Anzahl von Attributen haben, die für jedes einzelne Produkt vorhanden sind (wie Hersteller, Preis, Lagernummer usw.), ist es am besten, Spalten für diese Attribute zu haben und Ihre Schlüssel / Wert-Paare in ein flaches Tabellenformat zu konvertieren. mit einer Produkt-ID als Primärschlüssel für diese Tabelle. Dies funktioniert auch dann sehr gut, wenn einige Spalten nur von der Hälfte der Zeilen verwendet werden, da Sie für die meisten Produkte nur eine Abfrage ausführen müssen, um alle ihre Attribute abzurufen Dies sind Daten über Produkte. Ich würde vermuten, dass es sehr wahrscheinlich ist, dass dies die Struktur Ihrer Daten ist.
Wenn die Attribute in Bezug auf Präsenz und Datentyp stark variieren, ist es möglicherweise besser, eine noSQL-Datenbank zu verwenden, die dieses Szenario effizienter handhabt als herkömmliche SQL-Datenbanken.
In Bezug auf die Leistung: Ich habe zuvor für ein E-Commerce-Unternehmen gearbeitet, bei dem die Website lange Zeit mit Daten von einem MySQL-Server versorgt wurde. Dieser Server hatte 2 GB RAM, die Datenbank war insgesamt ca. Mit einer Größe von 5 GB und einer Spitzenlast behandelte der Server mehrere tausend Anfragen pro Sekunde. Ja, wir hatten viele Abfrageoptimierungen durchgeführt, aber dies ist definitiv machbar.
quelle