Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Langsamkeit festgestellt, wenn Base-64-Bild aus der Datenbank ausgewählt und codiert wird

Als Faustregel sollten Sie keine Dateien in der Datenbank speichern.

Was sagt das MySQL-Handbuch dazu? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html

Speichern Sie bei Webservern Bilder und andere binäre Assets als Dateien, wobei der Pfadname in der Datenbank und nicht in der Datei selbst gespeichert wird. Die meisten Webserver können Dateien besser zwischenspeichern als Datenbankinhalte, das Speichern von Dateien ist im Allgemeinen schneller. (Allerdings müssen Sie sich in diesem Fall selbst um Backups und Speicherprobleme kümmern.)

Speichern Sie keine Base4-kodierten Dateien in einer Datenbank

Funktioniert gut, aber so viel Zeit in Anspruch nehmen, dass ich erwartet hatte. Daher sind die Bilder um 33 % größer und sehen total wulstig aus.

Wie Sie festgestellt haben, wird unerwünschter Overhead beim Codieren/Decodieren + zusätzlicher Speicherplatz verbraucht, was auch zusätzliche Datenübertragung hin und her bedeutet.

Wie @mike-m erwähnt hat. Die Base64-Codierung ist keine Komprimierungsmethode. Warum die Base64-Codierung verwendet wird, wird auch durch einen Link beantwortet, den @mike-m gepostet hat Wofür wird die Base64-Codierung verwendet?.

Kurz gesagt, es gibt nichts zu gewinnen und viel zu verlieren, wenn Bilder mit base64 kodiert werden, bevor sie auf dem Dateisystem gespeichert werden, sei es S3 oder anders.

Was ist mit Gzip oder anderen Formen der Komprimierung ohne Einbeziehung von base64? Auch hier lautet die Antwort, dass es nichts zu gewinnen und viel zu verlieren gibt. Zum Beispiel habe ich gerade ein JPEG-Bild von 1941980 gezippt und 4000 Byte gespart, das sind 0,2 % Einsparung.

Der Grund dafür ist, dass Bilder bereits in komprimierten Formaten vorliegen. Sie können nicht weiter komprimiert werden.

Wenn Sie Bilder ohne Komprimierung speichern, können sie direkt an Browser und andere Clients geliefert und zwischengespeichert werden. Wenn sie komprimiert (oder base64-codiert) sind, müssen sie von Ihrer App dekomprimiert werden.

Moderne Browser können base64-Bilder anzeigen, die in HTML eingebettet sind, aber dann können sie nicht zwischengespeichert werden und die Daten sind etwa 30 % größer als nötig.

Ist das eine Ausnahme von der Norm?

Benutzer können dort Daten und Bilder posten und alles ist sicher.

Ich nehme an, Sie meinen, ein Benutzer kann Bilder herunterladen, die ihm gehören oder mit ihm geteilt werden. Dies kann leicht erreicht werden, indem die Dateien vom Webspace im Dateisystem gespeichert werden und nur der Pfad in der Datenbank gespeichert wird. Dann wird die Datei (nach Durchführung der erforderlichen Prüfungen) mit fpassthru

Was ist, wenn ich auf 100.000 Benutzer anwachse

Wie sie sich um Bilddateien kümmern. Bei Leistungsproblemen, wenn Largeuser beteiligt sind, brauche ich 100000 Ordner für 100000 Benutzer und deren Unterordner. Wenn eine große Anzahl von Benutzern denselben Stammordner durchsucht, wie das Dateisystem jeden einzelnen Ordner verarbeitet.

Verwenden Sie ein CDN oder verwenden Sie ein speziell dafür geeignetes Dateisystem wie BTRFS

Die Datenbank hat eine gute Suchfunktion, eine gute Thread-sichere Verbindung und ein gutes Sitzungsmanagement. Wird dieses Szenario geändert, wenn eine große Operation erforderlich ist?

Ja, in der Tat. Nutzen Sie es voll aus, indem Sie alle Informationen über die Datei und ihren Dateipfad in der Datenbank speichern. Speichern Sie dann die Datei selbst im Dateisystem. Sie erhalten das Beste aus beiden Welten.