sql >> Databáze >  >> RDS >> Mysql

Jak uložit 128bitové číslo do jednoho sloupce v MySQL?

Přistihl jsem se, že se ptám na tuto otázku a ze všech příspěvků, které jsem četl, jsem nenašel žádné srovnání výkonu. Takže tady je můj pokus.

Vytvořil jsem následující tabulky, naplněné 2 000 000 náhodnými IP adresami ze 100 náhodných sítí.

CREATE TABLE ipv6_address_binary (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr BINARY(16) NOT NULL UNIQUE
);

CREATE TABLE ipv6_address_twobigints (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    haddr BIGINT UNSIGNED NOT NULL,
    laddr BIGINT UNSIGNED NOT NULL,
    UNIQUE uidx (haddr, laddr)
);

CREATE TABLE ipv6_address_decimal (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr DECIMAL(39,0) NOT NULL UNIQUE
);

Poté VYBERU všechny ip adresy pro každou síť a zaznamenám dobu odezvy. Průměrná doba odezvy v tabulce twobigints je asi 1 sekunda, zatímco v tabulce binárních je to asi jedna setina sekundy.

Zde jsou dotazy.

SELECT COUNT(*) FROM ipv6_address_twobigints
WHERE haddr & NETMASK_HIGH = NETWORK_HIGH
AND laddr & NETMASK_LOW = NETWORK_LOW

SELECT COUNT(*) FROM ipv6_address_binary
WHERE addr >= NETWORK
AND addr <= BROADCAST

SELECT COUNT(*) FROM ipv6_address_decimal
WHERE addr >= NETWORK
AND addr <= BROADCAST

Průměrné doby odezvy:

Graf:

BINARY_InnoDB  0.0119529819489
BINARY_MyISAM  0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB  0.782350552082
BIGINT_MyISAM  1.07809265852


  1. SELECT INTO OUTFILE nemůže zapisovat do souboru

  2. Jak mohu použít ON DUPLICATE KEY UPDATE v PDO s mysql?

  3. Postgres výpis pouze částí tabulek pro vývojový snímek

  4. Aplikace Django pro více nájemců:změna databázového připojení na žádost?