sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar un número de 128 bits en una sola columna en MySQL?

Me encontré haciendo esta pregunta y de todas las publicaciones que leí nunca encontré ninguna comparación de rendimiento. Así que aquí está mi intento.

Creé las siguientes tablas, rellenadas con 2 000 000 de direcciones IP aleatorias de 100 redes aleatorias.

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

Luego SELECCIONO todas las direcciones IP para cada red y registro el tiempo de respuesta. El tiempo de respuesta promedio en la tabla de dos grandes bits es de aproximadamente 1 segundo, mientras que en la tabla binaria es de aproximadamente una centésima de segundo.

Aquí están las consultas.

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

Tiempos de respuesta promedio:

Gráfico:

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