Apakah ada tolok ukur kinerja MySQL untuk mengukur dampak utf8_unicode_ci dibandingkan utf8_general_ci?

13

Saya membaca di sini dan ada yang menggunakan utf8_unicode_cipemeriksaan menjamin perlakuan yang lebih baik dari teks unicode (misalnya, knowns bagaimana untuk memperluas karakter seperti 'œ' ke 'oe' untuk mencari dan memesan) dibandingkan dengan standar utf8_general_ciyang pada dasarnya hanya strip diakritik. Sayangnya, kedua sumber menunjukkan bahwa utf8_unicode_cisedikit lebih lambat daripada utf8_general_ci.

Jadi pertanyaan saya adalah: apa artinya "sedikit lebih lambat"? Adakah yang menjalankan tolok ukur? Apakah kita berbicara tentang dampak kinerja -0,01% atau lebih tepatnya seperti -25%?

Terima kasih atas bantuan Anda.

MiniQuark
sumber
Sejauh tolok ukur, mengapa tidak menggunakan waktu permintaan? Saya mungkin idiot, tetapi bagaimana jika Anda menjalankan VM dan menguji waktu permintaan pada permintaan rumit yang besar untuk kedua pengkodean karakter? (Saya belum pernah melihat benchmark dilakukan untuk ini sebelumnya)
Ablue

Jawaban:

8

Yah, saya tidak menemukan benchmark apa pun di Internet, jadi saya memutuskan untuk membuat benchmark sendiri.

Saya membuat tabel yang sangat sederhana dengan 500000 baris:

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

Lalu saya mengisinya dengan data acak dengan menjalankan prosedur tersimpan ini:

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

Kemudian saya membuat prosedur tersimpan berikut untuk membandingkan SELECT sederhana, SELECT dengan LIKE, dan mengurutkan (SELECT with ORDER BY):

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

Dalam prosedur tersimpan utf8_general_ci collation digunakan, tetapi tentu saja selama tes saya menggunakan utf8_general_ci dan utf8_unicode_ci.

Saya memanggil setiap prosedur tersimpan 5 kali untuk setiap pemeriksaan (5 kali untuk utf8_general_ci dan 5 kali untuk utf8_unicode_ci) dan kemudian menghitung nilai rata-rata.

Inilah hasilnya:

benchmark_simple_select () dengan utf8_general_ci: 9957 ms
benchmark_simple_select () dengan utf8_unicode_ci: 10271 ms
Dalam benchmark ini menggunakan utf8_unicode_ci lebih lambat daripada utf8_general_ci sebesar 3,2%.

benchmark_select_like () dengan utf8_general_ci: 11441 ms
benchmark_select_like () dengan utf8_unicode_ci: 12811 ms
Dalam benchmark ini menggunakan utf8_unicode_ci lebih lambat dari utf8_general_ci sebesar 12%.

benchmark_order_by () dengan utf8_general_ci: 11944 ms
benchmark_order_by () dengan utf8_unicode_ci: 12887 ms
Dalam benchmark ini menggunakan utf8_unicode_ci lebih lambat dari utf8_general_ci sebesar 7,9%.

nightcoder
sumber
2

Saya tidak melihat patokan apa pun, tetapi Anda dapat menjalankannya sendiri menggunakan fungsi BENCHMARK :

BENCHMARK (hitung, expr)

Seperti yang disarankan oleh Matthew, Anda dapat menjalankan instalasi paralel MYSQL, tetapi pertimbangkan bahwa mungkin ada perbedaan besar antara arsitektur yang berbeda (sparc, intel, 32bit, 64bit, ...).

tmow
sumber