Ik merkte dat ik deze vraag stelde en uit alle berichten die ik las, heb ik nooit prestatievergelijkingen gevonden. Dus hier is mijn poging.
Ik heb de volgende tabellen gemaakt, gevuld met 2.000.000 willekeurige ip-adressen van 100 willekeurige netwerken.
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
);
Dan SELECTEER ik alle ip-adressen voor elk netwerk en noteer ik de reactietijd. De gemiddelde responstijd op de twobigints-tabel is ongeveer 1 seconde, terwijl dit op de binaire tafel ongeveer een honderdste van een seconde is.
Dit zijn de vragen.
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
Gemiddelde reactietijden:
Grafiek:
BINARY_InnoDB 0.0119529819489
BINARY_MyISAM 0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB 0.782350552082
BIGINT_MyISAM 1.07809265852