さて、インターネットでベンチマークを見つけられなかったので、自分でベンチマークを作成することにしました。
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%遅い