Có một tiêu chuẩn hiệu suất MySQL để đo lường tác động của utf8_unicode_ci so với utf8_general_ci không?


13

Tôi đọc ở đâyở đó rằng sử dụng utf8_unicode_ciđối chiếu đảm bảo xử lý tốt hơn văn bản unicode (ví dụ: nó biết cách mở rộng các ký tự như 'œ' thành 'oe' để tìm kiếm và đặt hàng) so với mặc định utf8_general_civề cơ bản chỉ là dải chữ. Thật không may, cả hai nguồn chỉ ra rằng utf8_unicode_cihơi chậm hơn utf8_general_ci.

Vì vậy, câu hỏi của tôi là: "hơi chậm" có nghĩa là gì? Có ai chạy điểm chuẩn? Có phải chúng ta đang nói về tác động hiệu suất -0,01% hay đúng hơn là -25%?

Cảm ơn bạn đã giúp đỡ.


Theo như một điểm chuẩn, tại sao không sử dụng thời gian truy vấn? Tôi có thể là một thằng ngốc, nhưng nếu bạn chạy VM và kiểm tra thời gian truy vấn trên một truy vấn phức tạp lớn cho cả hai mã hóa ký tự thì sao? (Tôi chưa thấy điểm chuẩn được thực hiện cho việc này trước đây)
Ablue

Câu trả lời:


8

Chà, tôi không tìm thấy bất kỳ điểm chuẩn nào trên Internet, vì vậy tôi quyết định tự mình thực hiện các điểm chuẩn.

Tôi đã tạo một bảng rất đơn giản với 500000 hàng:

CREATE TABLE test(
  ID INT(11) DEFAULT NULL,
  Description VARCHAR(20) DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

Sau đó, tôi điền nó với dữ liệu ngẫu nhiên bằng cách chạy thủ tục được lưu trữ này:

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

Sau đó, tôi đã tạo các quy trình được lưu trữ sau đây để điểm chuẩn CHỌN đơn giản, CHỌN với THÍCH và sắp xếp (CHỌN với ĐẶT HÀNG B) NG):

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

Trong các thủ tục được lưu trữ ở trên, đối chiếu utf8_general_ci được sử dụng, nhưng tất nhiên trong các thử nghiệm tôi đã sử dụng cả utf8_general_ci và utf8_unicode_ci.

Tôi đã gọi mỗi thủ tục được lưu trữ 5 lần cho mỗi đối chiếu (5 lần cho utf8_general_ci và 5 lần cho utf8_unicode_ci) và sau đó tính các giá trị trung bình.

Đây là kết quả:

điểm
chuẩn_simple_select () với utf8_general_ci: 9957 ms điểm chuẩn_simple_select () với utf8_unicode_ci: 10271 ms
Trong điểm chuẩn này sử dụng utf8_unicode_ci chậm hơn utf8_general_ci bằng 3,2%.

điểm
chuẩn_elect_like () với utf8_general_ci: 11441 ms Bench_select_like () với utf8_unicode_ci: 12811 ms
Trong điểm chuẩn này sử dụng utf8_unicode_ci chậm hơn utf8_general_ci 12%.

điểm
chuẩn_order_by () với utf8_general_ci: 11944 ms điểm chuẩn_order_by () với utf8_unicode_ci: 12887 ms
Trong điểm chuẩn này sử dụng utf8_unicode_ci chậm hơn utf8_general_ci khoảng 7,9%.


2

Tôi không thấy bất kỳ điểm chuẩn nào, nhưng bạn có thể tự chạy bằng chức năng BENCHophone :

BẾN (đếm, expr)

Theo lời khuyên của Matthew, bạn có thể chạy cài đặt song song MYSQL, nhưng hãy xem xét rằng có thể có một sự khác biệt rất lớn giữa các kiến ​​trúc khác nhau (sparc, intel, 32bit, 64bit, ...).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.