Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichert man eine 128-Bit-Zahl in einer einzelnen Spalte in MySQL?

Ich habe diese Frage gestellt und in allen Beiträgen, die ich gelesen habe, keine Leistungsvergleiche gefunden. Also hier ist mein Versuch.

Ich habe die folgenden Tabellen erstellt, gefüllt mit 2.000.000 zufälligen IP-Adressen aus 100 zufälligen Netzwerken.

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

Dann wähle ich alle IP-Adressen für jedes Netzwerk aus und zeichne die Antwortzeit auf. Die durchschnittliche Antwortzeit auf der Twobigints-Tabelle beträgt etwa 1 Sekunde, während sie auf der Binärtabelle etwa eine Hundertstelsekunde beträgt.

Hier sind die Abfragen.

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

Durchschnittliche Antwortzeiten:

Grafik:

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