是否有 MySQL 性能基準來衡量 utf8_unicode_ci 與 utf8_general_ci 的影響?
我在這里和那裡讀到,與基本上只是去除變音符號的預設設置相比,使用
utf8_unicode_ci
排序規則可以確保更好地處理 unicode 文本(例如,它知道如何將諸如 ‘œ’ 之類的字元擴展為 ‘oe’ 以進行搜尋和排序) 。utf8_general_ci
不幸的是,這兩個消息來源都表明它utf8_unicode_ci
比utf8_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%。