我读到这里和那里,使用utf8_unicode_ci
核对,确保更好的治疗Unicode文本(例如,它的已知,如何扩展字符,如“O E”到“OE”的搜索和排序)相比默认utf8_general_ci
它基本上只是剥离变音符号。不幸的是,两个消息来源都表明该utf8_unicode_ci
速度慢于utf8_general_ci
。
所以我的问题是:“稍微慢一点”是什么意思?有没有人运行基准测试?我们是在谈论-0.01%的性能影响,或者说是-25%的影响?
谢谢你的帮助。
我读到这里和那里,使用utf8_unicode_ci
核对,确保更好的治疗Unicode文本(例如,它的已知,如何扩展字符,如“O E”到“OE”的搜索和排序)相比默认utf8_general_ci
它基本上只是剥离变音符号。不幸的是,两个消息来源都表明该utf8_unicode_ci
速度慢于utf8_general_ci
。
所以我的问题是:“稍微慢一点”是什么意思?有没有人运行基准测试?我们是在谈论-0.01%的性能影响,或者说是-25%的影响?
谢谢你的帮助。
Answers:
好吧,我在Internet上找不到任何基准,所以我决定自己创建基准。
我创建了一个非常简单的表,具有500000行:
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,使用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次(utf8_general_ci调用了5次,utf8_unicode_ci调用了5次),然后计算出平均值。
结果如下:
使用utf8_general_ci的Benchmark_simple_select():9957毫秒
使用utf8_unicode_ci的Benchmark_simple_select():10271毫秒
在此使用utf8_unicode_ci的基准测试中,比utf8_general_ci慢3.2%。
使用utf8_general_ci的
Benchmark_select_like():11441毫秒使用utf8_unicode_ci的Benchmark_select_like():12811毫秒
使用utf8_unicode_ci的在此使用utf8_unicode_ci的基准测试中,比utf8_general_ci慢12%。
带有utf8_general_ci的Benchmark_order_by():11944毫秒
带有utf8_unicode_ci的Benchmark_order_by():12887毫秒
在此使用utf8_unicode_ci的基准测试中,比utf8_general_ci慢7.9%。