Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar um número de 128 bits em uma única coluna no MySQL?


Eu me peguei fazendo essa pergunta e de todos os posts que li nunca encontrei nenhuma comparação de desempenho. Então aqui está a minha tentativa.

Eu criei as seguintes tabelas, preenchidas com 2.000.000 de endereços IP aleatórios de 100 redes aleatórias.
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
);

Então eu SELECIONO todos os endereços IP para cada rede e registro o tempo de resposta. O tempo médio de resposta na tabela twobigints é de cerca de 1 segundo, enquanto na tabela binária é de cerca de um centésimo de segundo.

Aqui estão as 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

Tempos médios de resposta:

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