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

Warum das abschließende 0x00-Byte nach der BSON-Zeichenfolge (nicht Cstring/ename)?

Sowohl für die Länge der Zeichenfolge als auch für das Null-Terminator gibt es zwei Gründe:Kompatibilität mit vorhandenen Zeichenfolgen im C-Stil und Leistung.

Aus Leistungsgründen muss MongoDB in der Lage sein, schnell zu einem bestimmten Feld in einem Dokument zu wechseln, ohne den gesamten BSON zu durchlaufen. Dies ist besonders wichtig, wenn Sie nach einem Feld suchen, das sich am Ende eines großen Dokuments (z. B. 16 MB) befindet. Da die Länge der Zeichenkette als eine der ersten Informationen zu einem Zeichenkettentyp codiert ist, kann sie diese Anzahl von Bytes einfach überspringen und zum nächsten Feld gelangen. Andernfalls muss es über die gesamte Zeichenfolge iterieren, bis es das Ende der Zeichenfolge findet.

Aus Kompatibilitätsgründen ist MongoDB in C++ geschrieben, wobei Strings nullterminiert sind . Es kann diesen Null-Terminator abschneiden, um ein Byte zu sparen, da die Länge codiert ist, aber um diese Zeichenfolge aus BSON in ein Format zu bringen, das von C++ verwendet werden kann, müsste diese Null erneut angehängt werden. Dies erfordert eine spezialisierte String-Behandlungsroutine, deren einziger Vorteil darin besteht, ein einzelnes Byte zu sparen.

Insgesamt wurde entschieden, dass das „Verschwenden“ eines einzelnen Bytes ein akzeptabler Kompromiss ist.