我在这里和那里读到,使用utf8_unicode_ci
sorting规则可以更好地处理unicode文本(例如,它知道如何将字符扩展为“oe”以进行search和sorting),与默认的utf8_general_ci
相比,变音符号。 不幸的是,这两个来源都表明utf8_unicode_ci
比utf8_general_ci
稍慢。
所以我的问题是:“略慢”是什么意思? 有没有人运行基准? 我们是在谈论一个-0.01%的performance影响,或者更像是-25%?
谢谢你的帮助。
那么,我在互联网上没有find任何基准,所以我决定自己做基准。
我创build了一个包含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
然后,我创build了以下存储过程来对简单的SELECT进行基准testing,使用LIKE进行SELECT和sorting(使用ORDER BY进行SELECT):
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_cisorting规则,但是在testing过程中,我使用了utf8_general_ci和utf8_unicode_ci。
我为每个归类调用每个存储过程5次(utf8_general_ci为5次,utf8_unicode_ci为5次),然后计算平均值。
结果如下:
benchmark_simple_select()与utf8_general_ci:9957毫秒
benchmark_simple_select()与utf8_unicode_ci:10271 ms
在这个基准testing中,使用utf8_unicode_ci的速度比utf8_general_ci慢3.2个百分点。
benchmark_select_like()与utf8_general_ci:11441毫秒
benchmark_select_like()与utf8_unicode_ci:12811毫秒
在这个基准testing中,使用utf8_unicode_ci的速度比utf8_general_ci慢12%。
benchmark_order_by()与utf8_general_ci:11944毫秒
benchmark_order_by()与utf8_unicode_ci:12887毫秒
在这个基准testing中,使用utf8_unicode_ci比utf8_general_ci慢7.9%。
我没有看到任何基准,但可以使用BENCHMARK函数运行自己的基准 :
BENCHMARK(计数,expression式)
正如Matthew所build议的那样,你可以运行MYSQL的并行安装,但是考虑到不同的体系结构(sparc,intel,32bit,64bit,…)可能会有很大的不同。