sql >> Database teknologi >  >> RDS >> Mysql

Hvordan gemmer man et 128 bit nummer i en enkelt kolonne i MySQL?

Jeg fandt mig selv stille dette spørgsmål, og fra alle de indlæg, jeg læste, fandt jeg aldrig nogen præstationssammenligninger. Så her er mit forsøg.

Jeg har oprettet følgende tabeller, udfyldt med 2.000.000 tilfældige ip-adresser fra 100 tilfældige netværk.

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

Så VÆLGER jeg alle ip-adresser for hvert netværk og registrerer responstiden. Den gennemsnitlige responstid på twobigints-tabellen er omkring 1 sekund, mens den på den binære tabel er omkring en hundrededel af et sekund.

Her er forespørgslerne.

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

Gennemsnitlige svartider:

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. Sådan forespørges sql med aktiv registrering for datoer mellem specificerede tidspunkter

  2. Flyt systemdatabaser i SQL Server Failover Cluster

  3. Membership.ValidateUser returnerer altid falsk efter opgradering til VS 2010 / .NET 4.0

  4. Brug af ubrugte primærnøgler