ฉันไม่พบการวัดประสิทธิภาพใด ๆ ในอินเทอร์เน็ตดังนั้นฉันตัดสินใจที่จะทำการวัดประสิทธิภาพด้วยตัวเอง
ฉันสร้างตารางง่าย ๆ ที่มีแถว 500,000 แถว:
CREATE TABLE test(
ID INT(11) DEFAULT NULL,
Description VARCHAR(20) DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
จากนั้นฉันก็เติมข้อมูลด้วยการสุ่มโดยรันโพรซีเดอร์ที่เก็บไว้นี้:
CREATE PROCEDURE randomizer()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE random CHAR(20) ;
theloop: loop
SET random = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO test VALUES (i+1, random);
SET i=i+1;
IF i = 500000 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
จากนั้นฉันสร้างโพรซีเดอร์ที่เก็บไว้ต่อไปนี้เพื่อสร้างเกณฑ์มาตรฐาน SELECT, SELECT พร้อม LIKE และทำการเรียงลำดับ (SELECT พร้อม ORDER BY):
CREATE benchmark_simple_select()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE Description = 'test' COLLATE utf8_general_ci;
SET i = i + 1;
IF i = 30 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
CREATE PROCEDURE benchmark_select_like()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE Description LIKE '%test' COLLATE utf8_general_ci;
SET i = i + 1;
IF i = 30 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
CREATE PROCEDURE benchmark_order_by()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE ID > FLOOR(1 + RAND() * (400000 - 1)) ORDER BY Description COLLATE utf8_general_ci LIMIT 1000;
SET i = i + 1;
IF i = 10 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
ในกระบวนงานที่เก็บไว้ข้างต้นใช้การเปรียบเทียบ utf8_general_ci แต่แน่นอนในระหว่างการทดสอบฉันใช้ทั้ง utf8_general_ci และ utf8_unicode_ci
ฉันเรียกแต่ละโพรซีเดอร์ที่เก็บไว้ 5 ครั้งสำหรับการเปรียบเทียบแต่ละครั้ง (5 ครั้งสำหรับ utf8_general_ci และ 5 ครั้งสำหรับ utf8_unicode_ci) จากนั้นคำนวณค่าเฉลี่ย
นี่คือผลลัพธ์:
benchmark_simple_select () พร้อม utf8_general_ci: 9957 ms
benchmark_simple_select () with utf8_unicode_ci: 10271 ms
ในการทดสอบประสิทธิภาพโดยใช้ utf8_unicode_ci นั้นช้ากว่า utf8_general_ci 3.2%
benchmark_select_like () with utf8_general_ci: 11441 ms
benchmark_select_like () with utf8_unicode_ci: 12811 ms
ในเบนช์มาร์กนี้ใช้ utf8_unicode_ci ช้ากว่า utf8_general_ci 12%
benchmark_order_by () กับ utf8_general_ci: 11944 ms
benchmark_order_by () กับ utf8_unicode_ci: 12887 ms
ในเบนช์มาร์กนี้การใช้ utf8_unicode_ci นั้นช้ากว่า utf8_general_ci 7.9%