是否有MySQL性能基准来衡量utf8_unicode_ci与utf8_general_ci的影响?


13

我读到这里那里,使用utf8_unicode_ci核对,确保更好的治疗Unicode文本(例如,它的已知,如何扩展字符,如“O E”到“OE”的搜索和排序)相比默认utf8_general_ci它基本上只是剥离变音符号。不幸的是,两个消息来源都表明该utf8_unicode_ci速度慢于utf8_general_ci

所以我的问题是:“稍微慢一点”是什么意思?有没有人运行基准测试?我们是在谈论-0.01%的性能影响,或者说是-25%的影响?

谢谢你的帮助。


就基准而言,为什么不使用查询时间?我可能是个白痴,但是如果您运行VM并在大型复杂查询中测试两种字符编码的查询时间该怎么办?(我之前从未见过基准测试过)
Ablue

Answers:


8

好吧,我在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%。


2

我没有看到任何基准,但是您可以使用BENCHMARK函数运行自己的基准

基准(计数,expr)

根据Matthew的建议,您可以运行MYSQL的并行安装,但是请考虑不同的体系结构(sparc,intel,32bit,64bit等)之间可能会有巨大差异。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.