Autor Zpráva
plundr
Profil *
Ahoj, mám v dataázi tabulku pro uchování ip adres. Bude stačit velikost 39 nebo ty adresy můžou být větší? Mám zvolit char nebo varchar? Ten char by byla asi při vyhledávání rychlejší...?
lionel messi
Profil
plundr:
Ten char by byla asi při vyhledávání rychlejší...?

Áno, char je za rovnakých podmienok rýchlejší typ než varchar, hovorí sa aj o 50-percentnom rozdieli v jeho prospech.

Bude stačit velikost 39 nebo ty adresy můžou být větší?

Čisto teoreticky môžu byť dlhé až 45 znakov. A pokiaľ nevieš, či dostaneš 39- alebo 45- znakovú verziu, tak voľba vyznieva jasne pre varchar (v char doplnenom medzerami by sa zrejme najlepšie nehľadalo).
Keeehi
Profil
lionel messi:
Ta rychlost mi přijde dost spekulativní. Jednak mi tam chybí nějaký relevantní zdroj nicméně i tak, podle toho co se tam píše tak by se jednalo o dost specifický případ. Jednak by všechny sloupce tabulky musely mít fixní velikost a za druhé, aby se to projevilo tak by se musel provádět full scan tabulky. Což vlastně při hledání vůbec nechceš aby se stalo. Chceš aby se použil index.

pokiaľ nevieš, či dostaneš 39- alebo 45- znakovú verziu
Tak hlavně většinou dostane tu IPv4 verzi co má maximálně 15 znaků.

plundr:
Použil bych varchar a vůbec se tím netrápil. Pro rychlost bude důležitější index než jaký datový typ zvolíš.
plundr
Profil *
Keeehi:
a za druhé, aby se to projevilo tak by se musel provádět full scan tabulky
teď si přesně nejsem jistý co myslíš tím full scanem, ta tabulka bude pro blokované IP adresy, aby například ten uživatel nemohl psát do chatu nebo přidávat komentáře. Jako ochrana proti trollům a spamu. V těchto případech budu vyhledávat zda neni ip blokována.
Serg
Profil *
Full scanem se myslí to, že se bude procházet řádek po řádku v celé tabulce, dokud se nenajde shoda, nebo se projede celá tabulka a nakonec to vrátí, že se ta IP nenašla.
Index nad sloupcem (nebo nad několika sloupci) ty záznamy udržuje seřazené, tak se pro vyhledávání může použít efektivnější algoritmus, např. binární strom.

Úplně nejrychlejší by bylo asi ukládat ty IP adresy do sloupce typu BINARY s délkou 128 bitů nebo DECIMAL(39,0). Ale zase jestli tam nebude sto tísíc IP adres, tak klidně VARCHAR.
plundr
Profil *
Serg:
Úplně nejrychlejší by bylo asi ukládat ty IP adresy do sloupce typu BINARY s délkou 128 bitů nebo DECIMAL(39,0). Ale zase jestli tam nebude sto tísíc IP adres, tak klidně VARCHAR.
Binary je tedy rychlejší tak proč by to mlo být jedno jestli varchar?

Jaký typ mám teda použít když tam budu dávat unique?
Serg
Profil *
Takle, VARCHAR je jednodušší v tom, že to nemusíš nějak extra převádět, tak jak tu IP dostaneš, tak ji uložíš do databáze. U BINARY bys to pravděpodobně musel nějak převést na binárná formát, a u DECIMAL na jedno velké číslo.
A jedno je to v případě, pokud tam těch IP nebude moc, tak mezi VARCHAR a BINARY bys neměl pocítit žádný rozdíl. Až kdyby ta tabulka měla třeba 100 000 záznamů, tak by tam mohl být rozdíl třeba 50 - 100ms na jedno vyhledání, ale to jen tak tipuju.

UNIQUE už je vlastně index, takže žádný další index pak vytvářet nemusíš.
Takže ten typ se rozhodni sám, jestli si s tím chceš hrát, a psát pro to funkci, která tu IP převede z řetězce na binární číslo a obráceně, nebo jednoduše použiješ VARCHAR 45
plundr
Profil *
Serg:
a jak je to velikostně? Vyjde to na stejně?
kdybych tu ip chtěl na binarní kod tak se to dělá přes base64_encode()?


když se rozhodnu pro varchar, jaký mám zvolit kodování? já mám ve výchozím utf8mb4_general_ci, ale na tohle by šlo asi i něco úspornějšího...
Serg
Profil *
plundr:
kdybych tu ip chtěl na binarní kod tak se to dělá přes base64_encode()?
Spíš inet_pton()

když se rozhodnu pro varchar, jaký mám zvolit kodování? já mám ve výchozím utf8mb4_general_ci, ale na tohle by šlo asi i něco úspornějšího...
Ona i UTF-8 by pro ASCII znaky měla zabírat jen 1 bajt. Případně Latin1.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0