Um zu wissen, warum dies hässlich ist, müssen Sie wissen, wie eine Datenbank auf der Festplatte gespeichert wird (insbesondere Zeilen). Der physische Inhalt einer auf der Festplatte gespeicherten Zeile wird in ihre statischen und dynamischen Gegenstücke unterteilt. Felder wie int, byte, char (n) mit fester Länge werden zuerst aufgelistet. Was folgt, ist eine Anzahl fester Länge, die sich auf die Anzahl der Felder variabler Länge bezieht, die folgen sollen. Alle variablen Felder (unabhängig von der Reihenfolge der Spalten, die Ihnen, dem Programmierer, angezeigt werden) werden am Ende hinzugefügt. Jedes Feld enthält eine feste Länge, die bestimmt, wie viel Platz das Feld mit variabler Länge einnimmt.
Um Ihnen ein konkretes Beispiel zu geben. Angenommen, meine Tabelle lautet wie folgt:
char(3) A
varchar(4) B
int C
Angenommen, ich tue es INSERT INTO mytable (A, B, C) VALUES ('AAA', 'B', 256)
. In der Datenbank würde diese Zeile wahrscheinlich wie folgt gespeichert:
Feld A wird wie erwartet gespeichert. Hätte ich 'A' eingefügt, hätte es ein Sonderzeichen gegeben, um das vorzeitige Ende der Zeichenfolge nach dem ersten Zeichen zu markieren, aber es würde den gleichen Platz einnehmen.
Feld C wird als binäres Äquivalent von 256 gespeichert. Warum C und nicht B? C ist das nächste statische Feld mit fester Länge und wird daher zusammen mit allen anderen statischen Daten in der Datenbankzeile gruppiert.
Feld D ist eine Metainformation für die Datenbank, die angibt, dass im folgenden Abschnitt mit Feldern variabler Länge genau 1 Feld vorhanden ist.
Feld E ist wieder eine Metainformation für die Datenbank, die angibt, dass es für dieses bestimmte Feld höchstens 1 Zeichen lang ist. Diese Informationen sind wichtig, da die Datenbank sonst nicht wissen würde, wo Feld B endet und ein anderes Feld mit variabler Länge beginnt.
All dies, um zu demonstrieren, wie Datenbanken das Speichern von Feldern mit variabler Länge handhaben. BLOB ist in diesem Sinne ein Feld variabler Länge. Die Datenbankstruktur ermöglicht es einer Zeile, sowohl kleine als auch große Werte im BLOB zu enthalten. Hier spielen jedoch andere Faktoren eine Rolle. Datenbanken verarbeiten normalerweise Informationsblöcke, da sich Datenträger nicht um den Inhalt kümmern, sondern darum, ob er in einen einzelnen Block passt.
Die Datenbank versucht, so viele Zeilen in einen einzelnen Block zu passen, ohne eine Zeile in zwei Teile trennen zu müssen, da der Effekt ansonsten der gleiche ist wie bei einer fragmentierten Datei auf Ihrer Festplatte. Sobald ein Block geladen ist und die Zeile diesen bestimmten Block überläuft, muss die Festplatte in einem anderen Block nach dem Rest suchen. Schlimmer noch, eine Datenbank kann auf keinen Fall erkennen, dass eine Zeile mehr als einen Block belegt, ohne ihren Inhalt vollständig zu lesen, da sie eine variable Länge hat. Sie können also nicht optimieren, indem Sie beide Blöcke gleichzeitig abrufen.
Wenn Sie nach dieser Logik ein BLOB mit statischer Länge erstellen könnten, hätten Sie dieses Optimierungsproblem nicht, da die Datenbank einfach garantieren könnte, dass die Blockgröße größer als die minimale Zeilengröße ist, wodurch sichergestellt wird, dass die meisten Zeilen dies nicht tun müssen auf mehrere Chunks aufgeteilt werden. Datenbanken tun dies natürlich nicht, da dies bedeuten würde, wertvollen Speicherplatz bereitzustellen, wenn Sie ihn wahrscheinlich nicht benötigen.
BLOBS sind in Ordnung, wenn Sie mit relativ kleinen Mengen arbeiten, aber für große Dateien wie Videos und dergleichen besteht eine häufige Problemumgehung darin, einfach den Dateipfad in der Datenbank zu speichern und die Software das Laden der Datei übernehmen zu lassen, was fast immer mehr ist effizient.
Hoffe das erklärt es. :) :)