Ich weiß und verstehe, dass es Leistungseinbußen beim Speichern von Blob-Daten in der Datenbank gibt, aber der Blob-Teil der Daten wird selten abgerufen / angezeigt, sondern für kleinere Daten (die überwiegende Mehrheit unter 256 KB mit maximal 10 MB). wird es von den meisten Kunden nicht verwendet, und die Gesamtzahl der Zeilen wird voraussichtlich relativ niedrig sein, sehr wahrscheinlich unter einer halben Million, wenn nicht weniger. Außerdem sind einige Daten dynamisch und können sich für einige Benutzer ändern, da es sich nicht um statische Bilder handelt. Mit anderen Worten, wir sind am Rande der Frage, ob es sich lohnt oder nicht.
Ich lese immer wieder, dass es besser ist, im Dateisystem zu speichern, aber ich kann keine tatsächlichen Metriken finden, die den Leistungsunterschied anzeigen, sondern nur Leute, die sich ohne konkrete Beweise oder Metriken wiederholen. Für uns ist es möglicherweise die Leistungskosten wert, wenn Sie vollständig ACID sind und sicherstellen, dass alle unsere Backups vollständig synchronisiert sind.
Davon abgesehen kennt oder hat jemand Metriken aus der realen Welt, um den Leistungsunterschied zwischen dem Speichern von Elementen als Blobs und im Dateisystem anzuzeigen. Ich versuche zu verstehen, ob sich die Leistungsstrafe lohnt oder nicht, anstatt blind der allgemeinen Faustregel zu folgen und nachdem ich mindestens 2-3 Stunden verbracht habe und ich noch nicht in der Lage bin, jemanden zu sehen, der tatsächliche Zahlen zeigt. Es sind alles nur Worte mit nichts Konkretem.
Dies ist übrigens eine MySQL InnoDB-Tabelle. Die eigentliche Datentabelle verfügt über einen Link zur Blob-Datentabelle, sodass der Blob nicht in der Hauptdatei enthalten ist und nur bei Bedarf abgerufen wird, um E / A-Probleme zu vermeiden. Mit anderen Worten, anstelle des Pfads zu den Daten im Dateisystem handelt es sich um eine ID für eine andere Tabelle mit nur Blobs. Wie ist das in Bezug auf die Leistung zu vergleichen? Ist es 25% schlimmer? Ist es 100%? Ist es 200-500%? Ist es 1000%?
Wenn die Kosten nur 100% -200% betragen, lohnt es sich wahrscheinlich für uns, da die Daten wiederum selten abgerufen werden. Selbst wenn wir 10.000 gleichzeitige Benutzer sagen würden, würden vielleicht nur 50 Benutzer ihre Blob-Daten bestenfalls gleichzeitig abrufen. Ja, die Daten sind für jeden Benutzer spezifisch, es sind keine Bilder.
quelle
BLOB
für Bilder, komprimierten Text und andere Dinge für verschiedene Projekte verwendet. Alternativ habe ich auch URLs für Bilder verwendet. Ich fand keine "extrem schlechte Leistung". Ein Argument dafürBLOB
ist, dass die "Datei" (Tabelle), die das BLOB enthält, bereits geöffnet ist, während der andere Ansatz die Datei suchen und öffnen muss. Das Öffnen von Dateien, insbesondere unter Windows, kann langsam sein.Das größte Problem, was passiert, wenn BLOB in db gespeichert wird - Es fragt wie folgt ab:
Selbst wenn es nach WHERE nur wenige Zeilen zurückgibt, arbeitet der Server jedoch mit einer riesigen Datengröße.
Lösung - geteilte Tabelle für:
oder einfach alle Anfragen richtig behandeln:
In die Spaltenliste nur die wirklich notwendige Spalte aufnehmen, BLOB-Daten nach einer zweiten Anforderung mit Zugriff durch PK anfordern
übrigens zweitgrößtes Problem hinzufügen, wenn BLOB in db gespeichert -
quelle
Aus Sicht des Programmierers kann es 100.000.000 Prozent schlimmer sein. Oder sogar eine Milliarde Mal so schlimm. Blobs geben keine Dateihandles zurück. Dies ist eine bevorstehende Funktion der BLOB Locator-API . Das heißt, Sie haben keine Fähigkeit dazu
seek
. PostgreSQL bietet bytea (das Äquivalent von blob ) und large_objects : Derlarge_object
Typ befindet sich in der Nähe der Locator-API. Das Fehlen des tatsächlichen Abrufs eines Dateihandles macht das Arbeiten mit einer serverseitigen API oder das Erstellen eines Frontends zu einer Menge Spaß! Stellen Sie sich HTTP vor, bei dem für jede teilweise Download-Anforderung vom Client ein vollständiger BLOB-Abruf vom Server erforderlich war - jetzt können Sie dies tun!Sie können nicht nur nicht suchen, sondern Sie können die ungepufferten Blobs nicht über die Clientbibliothek in C aus den Dokumenten empfangen
Auch aus den Dokumenten,
Außerdem kann der Server allgemeine Speicherrichtlinien auf den Blob unter der Haube anwenden, einschließlich Komprimierungsaufwand.
Sie sagen auch, dass die Daten dynamisch sind. Sie bestätigen, dass es ACID-konform ist. Verstehst du, wenn sich dieser Blob ändert, wirst du die gesamte Zeile neu schreiben? Der Prozess der Zeilengenerierung und des Schreibens der Nicht-Blob-Komponenten auf den Heap ist nicht kostenlos und sollte als Overhead angesehen werden, wenn Sie nur den Blob aktualisieren müssen.
Also ja, es gibt viele Gemeinkosten und Nachteile. Als allgemeine Praxis schlage ich dies niemals vor.
quelle