ฉันพบว่าตัวเองถามคำถามนี้และจากโพสต์ทั้งหมดที่ฉันอ่านไม่เคยพบการเปรียบเทียบประสิทธิภาพใด ๆ ดังนั้นนี่คือความพยายามของฉัน
ฉันได้สร้างตารางต่อไปนี้แล้วโดยมีที่อยู่ IP สุ่ม 2,000,000 จากเครือข่ายสุ่ม 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 ทั้งหมดสำหรับแต่ละเครือข่ายและบันทึกเวลาตอบสนอง เวลาตอบสนองโดยเฉลี่ยในตาราง twobigints อยู่ที่ประมาณ 1 วินาทีในขณะที่บนโต๊ะไบนารีจะอยู่ที่ประมาณหนึ่งในร้อยของวินาที
นี่คือแบบสอบถาม
บันทึก:
X_ [สูง / ต่ำ] เป็น 64- บิตที่สำคัญที่สุดของ X
เมื่อ NETMASK_LOW เป็น 0 เงื่อนไข AND จะถูกละเว้นเนื่องจากให้ผลเป็นจริงเสมอ ไม่ส่งผลกระทบต่อประสิทธิภาพมากนัก
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