porovnej bson msgpack a formáty, které pro přenos dat pouziva MySQL a PostgreSQL
Skvěle zacílená otázka. Porovnání těchto formátů je vlastně srovnání dvou velmi rozdílných světů:
COM_QUERY, COM_STMT_EXECUTE), odpovědi, data, chyby a stavové informace.MYSQL_TYPE_LONG, MYSQL_TYPE_VARCHAR).Parse, Bind, Execute) a podrobný přenos výsledků včetně metadat o sloupcích.| Vlastnost | BSON / MessagePack | MySQL / PostgreSQL Protokol |
|---|---|---|
| Primární účel | Sérializace struktur dat pro přenos/uložení | Komunikace mezi klientem a databázovým serverem |
| Obsah | Pouze data a jejich struktura | Data + metadata (typ sloupce, chyby, stav, počet řádků) + příkazy ( SELECT, INSERT) |
| Datové typy | Obecné (string, number, bool, binární…) | Specifické pro DB ( VARCHAR(255), INTEGER, TIMESTAMP WITH TIME ZONE, JSONB) |
| Vztah k DB | Datový formát, který může být uložen v DB | Nosič, který přenáší vše, co DB potřebuje k práci |
| Optimalizace | Rychlost (de)serializace, velikost | Rychlost provedení dotazu, nízká režie spojení |
| Příklad | {"name": "Alice", "age": 30} → binární blob |
COM_QUERY → SELECT * FROM users → Resultset (hlavička s typy sloupců → řádky v binárním formátu) |
BSON a MessagePack jsou jako „krabice“.
JSONB nebo BYTEA.MySQL a PostgreSQL protokoly jsou jako „logistický a komunikační proces“.
SELECT), skladník (server) potvrdí objednávku, najde zboží, zabalí ho na paletu (výsledek ve svém interním binárním formátu), přidá dodací list (metadata o sloupcích) a pošle vám ho. Samotná krabice (data) je jen součástí zásilky.Závěr: Nejsou to přímo srovnatelné věci. BSON a MessagePack jsou formáty dat. MySQL a PostgreSQL protokoly jsou dopravní prostředky, které tyto formáty (a mnoho dalších věcí) přepravují. Databáze často používají své vlastní, highly optimized binární formáty pro přenos dat uvnitř svého protokolu, protože jsou přímo svázané s jejich interními datovými typy a strojovým kódem.
přenos záznamu z tabulky co zaznamu PostgreSQL a bson, srovnej velikost
Skvěle zacílený dotaz. Srovnání velikosti přenosu konkrétního záznamu odhaluje klíčový rozdíl mezi čistě datovým formátem (BSON) a komunikačním protokolem (PostgreSQL).
Provedeme srovnání na konkrétním příkladu.
users Předpokládejme jednoduchou tabulku:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER,
is_active BOOLEAN DEFAULT true,
last_login TIMESTAMP
);
A jeden vzorový záznam:
INSERT INTO users (name, age, is_active, last_login)
VALUES ('Jan Novák', 30, true, '2024-05-15 14:32:10');
BSON je formát pouze pro data. Sérializuje se do podoby, kterou lze uložit nebo přenést.
BSON reprezentace datového záznamu:
{
"id": 1,
"name": "Jan Novák",
"age": 30,
"is_active": true,
"last_login": 1715783530000 // Unix timestamp v milisekundách
}
Odhadovaná velikost BSON:
id: 1 (typ int32): 1 bajt (typ) + 3 bajty (klíč „id“) + 4 bajty (hodnota) = ~8 bajtůname: "Jan Novák" (typ string): 1 bajt (typ) + 5 bajtů (klíč „name“) + 4 bajty (délka řetězce) + 10 bajtů (utf-8 obsah) = ~20 bajtůage: 30 (typ int32): 1 + 4 + 4 = ~9 bajtůis_active: true (typ boolean): 1 + 9 + 1 = ~11 bajtůlast_login: 1715783530000 (typ datetime): 1 + 10 + 8 = ~19 bajtůPřibližná celková velikost BSON dokumentu: ~72 bajtů.
Toto je čistá, zašifrovaná data bez jakékoli režie protokolu.
PostgreSQL protokol přenáší nejen data, ale i veškerou nutnou metainformaci. Při přenosu výsledku dotazu SELECT * FROM users server pošle:
Row Description Message: Hlavička popisující každý sloupec ve výsledku.
Data Row Message: Samotná data záznamu.
NULL, je zde –1)id (integer): 4 bajty (délka) + 4 bajty (data) = 8 bajtůname (varchar): 4 bajty (délka) + 10 bajtů (data „Jan Novák“) = 14 bajtůage (integer): 4 + 4 = 8 bajtůis_active (boolean): 4 + 1 = 5 bajtůlast_login (timestamp): 4 + 8 = 12 bajtůCommand Completion Message: Zpráva o úspěšném provedení příkazu. (~10–15 bajtů).
Přibližná celková velikost přenosu pro jeden záznam: ~163 – 218 bajtů. (Row Description + Data Row + Completion)
| Vlastnost | BSON (pouze data) | PostgreSQL Protocol (přenos dotazu) |
|---|---|---|
| Obsah přenosu | Pouze sérializovaná data záznamu. | Data + Metadata (popis sloupců, stavové zprávy) + Režie protokolu. |
| Velikost pro příklad | ~72 bajtů | ~160–220 bajtů |
| Proč je rozdíl? | BSON je úsporný kontejner na data. | PG protokol je robustní nástroj, který musí přenést vše potřebné pro libovolný dotaz a jeho výsledek. Přenáší „manuál“ k datům (Row Description) spolu s daty samotnými. |
| Podpora datových typů | Obecné (string, int, bool…). Může ztratit specifika (např. VARCHAR(100) vs TEXT). |
Přesné a bohaté. Zachovává všechny specifika databázových typů (OID, modifikátory). |
| Čitelnost | Binární (nečitelné bez deserializace). | Binární (nečitelné bez znalosti protokolu). |
psycopg2 nebo pq v Go). Tato režie je fixní a její relativní význam pro celkový přenos klesá s počtem vrácených řádků.Analogii: Posíláte dopis. BSON je jen samotný text na papíře. PostgreSQL protokol je celá obálka i s adresou, razítkem pošty a doprovodnými formuláři, které zajistí, že dopis dojde správně a adresát mu porozumí.