Mysql

是否有 MySQL 性能基準來衡量 utf8_unicode_ci 與 utf8_general_ci 的影響?

  • March 3, 2013

我在這里那裡讀到,與基本上只是去除變音符號的預設設置相比,使用utf8_unicode_ci排序規則可以確保更好地處理 unicode 文本(例如,它知道如何將諸如 ‘œ’ 之類的字元擴展為 ‘oe’ 以進行搜尋和排序) 。utf8_general_ci不幸的是,這兩個消息來源都表明它utf8_unicode_ciutf8_general_ci.

所以我的問題是:“稍微慢一點”是什麼意思?有人執行基準測試嗎?我們是在談論-0.01% 的性能影響還是-25% 之類的東西?

謝謝你的幫助。

好吧,我在網際網路上沒有找到任何基準,所以我決定自己做基準。

我創建了一個包含 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 次),然後計算平均值。

結果如下:

benchmark_simple_select() with utf8_general_ci: 9957 ms

benchmark_simple_select() with utf8_unicode_ci: 10271 ms

在這個基準測試中,使用 utf8_unicode_ci 比 utf8_general_ci 慢 3.2%。

benchmark_select_like() with utf8_general_ci: 11441 ms

benchmark_select_like() with utf8_unicode_ci: 12811 ms

在這個基準測試中,使用 utf8_unicode_ci 比 utf8_general_ci 慢 12%。

benchmark_order_by() with utf8_general_ci: 11944 ms

benchmark_order_by() with utf8_unicode_ci: 12887 ms

在這個基準測試中,使用 utf8_unicode_ci 比 utf8_general_ci 慢 7.9%。

引用自:https://serverfault.com/questions/157541