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

Come memorizzare un numero a 128 bit in una singola colonna in MySQL?

Mi sono ritrovato a fare questa domanda e da tutti i post che ho letto non ho mai trovato confronti di prestazioni. Quindi ecco il mio tentativo.

Ho creato le seguenti tabelle, popolate con 2.000.000 di indirizzi IP casuali da 100 reti casuali.

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

Quindi SELEZIONO tutti gli indirizzi IP per ciascuna rete e registro il tempo di risposta. Il tempo medio di risposta sulla tabella twobigints è di circa 1 secondo mentre sulla tabella binaria è di circa un centesimo di secondo.

Ecco le domande.

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

Tempi di risposta medi:

Grafico:

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