Я искал лучший тип данных в mysql, чтобы использовать для хранения адреса ipv6 недавно.Я не нашел веской причины использовать VARCHAR (), только веские причины NOT to.
Я провел некоторое тестирование производительности с данными BINARY (16), двумя BIGINT UNSIGNED и DECIMAL.типы.
Я создал следующие таблицы, заполненные 2 000 000 случайных IP-адресов из 100 случайных сетей.
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
);
Затем я выбираю все IP-адреса для каждой сети и записываю время отклика.,Среднее время отклика для таблицы с двумя значениями составляет около 1 секунды, в то время как для двоичной таблицы оно составляет примерно одну сотую секунды.
Вот запросы.
Примечание:
X_ [HIGH / LOW] является наиболее / наименее значимым 64-разрядным битом X
, когда NETMASK_LOW равен 0, условие AND опускается, поскольку оно всегда возвращает true.не сильно влияет на производительность.
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
Среднее время ответа:
BINARY_InnoDB 0.0119529819489
BINARY_MyISAM 0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB 0.782350552082
BIGINT_MyISAM 1.07809265852