sql >> Databáze >  >> NoSQL >> MongoDB

uložit IP adresu do mongoDB

IP adresy rozhodně ukládejte jako čísla, pokud vám nevadí ta práce navíc, zvláště pokud potřebujete na adresy provádět dotazy a máte velké tabulky/kolekce.

Zde je důvod:

Úložiště

  • Adresa IPv4 má 4 bajty, pokud je uložena jako celé číslo bez znaménka.
  • Adresa IPv4 se pohybuje mezi 10 bajty a 18 bajty, když je zapsána jako řetězec ve tvaru teček. (Předpokládejme, že průměr je 14 bajtů.)

To je 7–15 bajtů pro znaky plus 2–3 bajty, pokud používáte typ řetězce s proměnnou délkou, který se liší v závislosti na databázi, kterou používáte. Pokud máte k dispozici reprezentaci řetězce s pevnou délkou, musíte použít 15znakové pole s pevnou šířkou.

Diskové úložiště je levné, takže to není faktor ve většině případů použití. Paměť však není tak levná, a pokud máte velkou tabulku/sbírku a chcete dělat rychlé dotazy, potřebujete index. Dvojnásobná až trojnásobná sankce za ukládání v podobě kódování řetězců drasticky snižuje množství záznamů, které můžete indexovat, a přitom zůstává index uložený v paměti.

  • Adresa IPv6 má 16 bajtů, pokud je uložena jako celé číslo bez znaménka. (Pravděpodobně jako více 4 nebo 8 bajtových celých čísel, v závislosti na vaší platformě.)
  • Adresa IPv6 má rozsah od 6 bajtů do 42 bajtů, je-li zakódována jako řetězec ve zkráceném hexadecimálním zápisu.

Na spodním konci je zpětná adresa smyčky (::1) 3 bajty plus režie řetězce proměnné délky. V horní části adresa jako 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2 používá 39 bajtů plus režii řetězce proměnné délky.

Na rozdíl od IPv4 není bezpečné předpokládat, že průměrná délka řetězce IPv6 bude průměrně 6 a 42, protože počet adres s významným počtem po sobě jdoucích nul je velmi malý zlomek celkového prostoru adres IPv6. Tímto způsobem budou pravděpodobně komprimovatelné pouze některé speciální adresy, jako jsou adresy zpětné smyčky a autoconf.

Opět se jedná o>2x penalizaci úložiště za kódování řetězců oproti kódování celých čísel.

Síťová matematika

Myslíte si, že routery ukládají IP adresy jako řetězce? Samozřejmě, že ne.

Pokud potřebujete provést síťovou matematiku na IP adresách, reprezentace řetězců je problém. Např. pokud chcete napsat dotaz, který hledá všechny adresy v konkrétní podsíti ("vrátit všechny záznamy s IP adresou v 10.7.200.104/27", můžete to snadno udělat maskováním celočíselné adresy maskou podsítě celého čísla. ( Mongo tento konkrétní dotaz nepodporuje, ale většina RDBMS ano.) Pokud ukládáte adresy jako řetězce, pak váš dotaz bude muset převést každý řádek na celé číslo a poté jej zamaskovat, což je o několik řádů pomalejší. (Bitové maskování pro adresu IPv4 lze provést během několika cyklů CPU pomocí 2 registrů. Převod řetězce na celé číslo vyžaduje smyčkování řetězce.)

Podobně rozsahové dotazy ("vrací všechny záznamy všechny záznamy mezi 192.168.1.50 a 192.168.50.100") s celočíselnými adresami budou moci používat indexy, zatímco rozsahové dotazy na řetězcové adresy nikoli.

Sečteno a podtrženo

Vyžaduje to trochu více práce, ale ne mnoho (existuje milion funkcí aton() a ntoa()), ale pokud stavíte něco vážného a pevného a chcete to do budoucna zajistit proti budoucím požadavkům a Vzhledem k možnosti velké datové sady byste měli IP adresy ukládat jako celá čísla, nikoli řetězce.

Pokud děláte něco rychlého a špinavého a nevadí vám možnost v budoucnu předělat, pak použijte provázky.

Pro účely OP, pokud optimalizujete na rychlost a prostor a nemyslíte si, že to chcete často dotazovat, tak proč vůbec používat databázi? Stačí vytisknout IP adresy do souboru. To by bylo rychlejší a efektivnější než ukládání do databáze (s přidruženým API a režií úložiště).



  1. Doporučení klientské knihovny Redis pro použití od společnosti Scala

  2. MongoDB – Index se nepoužívá při řazení a omezuje se na dotaz s rozsahem

  3. Jak redis vyprší platnost klíčů?

  4. $unionWith – MongoDB je ekvivalent UNION ALL