Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker un nombre de 128 bits dans une seule colonne dans MySQL ?

Je me suis retrouvé à poser cette question et de tous les messages que j'ai lus, je n'ai jamais trouvé de comparaisons de performances. Voici donc ma tentative.

J'ai créé les tableaux suivants, remplis de 2 000 000 d'adresses IP aléatoires provenant de 100 réseaux aléatoires.

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

Ensuite, je SÉLECTIONNE toutes les adresses IP pour chaque réseau et j'enregistre le temps de réponse. Le temps de réponse moyen sur la table twobigints est d'environ 1 seconde alors que sur la table binaire, il est d'environ un centième de seconde.

Voici les requêtes.

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

Temps de réponse moyens :

Graphique :

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