utf8_unicode_ciとutf8_general_ciの影響を測定するMySQLパフォーマンスベンチマークはありますか?


13

私が読んでここそこに使用していることをutf8_unicode_ci照合すると、デフォルトに比べて(例えば、そのような検索や発注のための「OE」へのOE」などの文字を拡大する方法をknowns)のUnicodeテキストのより良い治療を保証utf8_general_ci基本的には発音区別符号を除去します。残念なことに、両方のソースは、それutf8_unicode_ciがよりもわずかに遅いことを示していutf8_general_ciます。

だから私の質問は:「少し遅い」とはどういう意味ですか?誰もベンチマークを実行していますか?パフォーマンスの影響が-0.01%なのか、それとも-25%のようなものですか?

ご協力いただきありがとうございます。


ベンチマークに関しては、クエリ時間を使用してみませんか?私はばかかもしれませんが、VMを実行し、両方の文字エンコーディングの大規模で複雑なクエリでクエリ時間をテストするとどうなりますか?(これまでにベンチマークが行われたのを見たことはありません)
Ablue

回答:


8

さて、インターネットでベンチマークを見つけられなかったので、自分でベンチマークを作成することにしました。

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を使用した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_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
を使用したベンチマーク_Simple_select():10271ミリ秒

utf8_general_ci を使用
したBenchmark_select_like():11441ミリ秒
utf8_unicode_ciを使用したBenchmark_select_like():12811ミリ秒

utf8_general_ciを使用したbench_order_by():11944 ms
utf8_unicode_ci
を使用したベンチマーク_order_by():12887 ms utf8_unicode_ciを使用したこのベンチマークでは、utf8_general_ciよりも7.9%遅い


2

ベンチマークは表示されませんでしたが、BENCHMARK関数を使用して独自のベンチマークを実行できます。

BENCHMARK(count、expr)

Matthewのアドバイスに従って、MYSQLの並列インストールを実行できますが、異なるアーキテクチャ(sparc、intel、32bit、64bitなど)には大きな違いがあることを考慮してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.