sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man ett 128-bitars nummer i en enda kolumn i MySQL?

Jag kom på mig själv med att ställa den här frågan och från alla inlägg jag läste hittade jag aldrig några prestationsjämförelser. Så här är mitt försök.

Jag har skapat följande tabeller, fyllda med 2 000 000 slumpmässiga ip-adresser från 100 slumpmässiga nätverk.

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
);

Sedan VÄLJER jag alla ip-adresser för varje nätverk och registrerar svarstiden. Den genomsnittliga svarstiden på twobigints-tabellen är cirka 1 sekund medan den i den binära tabellen är cirka en hundradels sekund.

Här är frågorna.

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

Genomsnittliga svarstider:

Diagram:

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. Konvertera datumformat till DD/MMM/ÅÅÅÅ-format i SQL Server

  2. Analysera ODBC-data i IBM SPSS

  3. Skadliga, genomgripande SQL Server-prestandamyter

  4. Stora .PDF-filer laddas inte upp till MySQL-databasen som medium BLOB via PHP, filer under 2 MB fungerar bra