Utf8_unicode_ci ve utf8_general_ci'nin etkisini ölçmek için bir MySQL performans ölçütü var mı?


13

Okudum burada ve orada kullanarak o utf8_unicode_ciharmanlamayı unicode metin daha iyi muamele edilmesini sağlayan varsayılan kıyasla (örneğin, arama ve sipariş için 'oe' içine gibi karakterler 'œ' genişletmek için nasıl Bilinenler) utf8_general_citemelde sadece aksan şeritler. Ne yazık ki, her iki kaynak da utf8_unicode_cibunun biraz daha yavaş olduğunu gösteriyor utf8_general_ci.

Benim sorum şu: “biraz daha yavaş” ne demek? Karşılaştırmalı değerlendirme yapan var mı? % -0,01 performans etkisinden mi, yoksa% -25 gibi bir şeyden mi bahsediyoruz?

Yardımın için teşekkürler.


Bir ölçüt kadar, neden sorgu süresini kullanmıyorsunuz? Ben bir aptal olabilir, ama bir VM koştu ve her iki karakter kodlamaları için büyük bir karmaşık sorgu üzerinde sorgu süresi test ederseniz? (Bunun için daha önce kıyaslama yapıldığını görmedim)
Ablue

Yanıtlar:


8

İnternette hiçbir ölçüt bulamadım, bu yüzden kendim için ölçütler yapmaya karar verdim.

500000 satırlı çok basit bir tablo oluşturdum:

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

Sonra bu saklı yordamı çalıştırarak rastgele verilerle doldurdu:

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

Sonra basit SELECT, LIKE ile SELECT ve sıralama (ORDER BY ile SELECT) karşılaştırması için aşağıdaki saklı yordamları oluşturdum:

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

Yukarıdaki saklı yordamlarda utf8_general_ci harmanlama kullanılır, ancak elbette testler sırasında hem utf8_general_ci hem de utf8_unicode_ci kullandım.

Her saklı yordamı her harmanlama için 5 kez (utf8_general_ci için 5 kez ve utf8_unicode_ci için 5 kez) çağırdı ve sonra ortalama değerleri hesapladı.

Sonuçlar burada:


utf8_unicode_ci ile benchmark_simple_select () : 9957 ms utf8_unicode_ci ile benchmark_simple_select (): 10271 ms
utf8_unicode_ci kullanan bu ölçütte utf8_unicode_ci kullanan bu kıyaslama değerinde utf8_unicode_ci% 3,2 daha yavaştır.

utf8_general_ci ile benchmark_select_like (): 11441 ms
utf8_unicode_ci ile benchmark_select_like (): 12811 ms
utf8_unicode_ci kullanan bu ölçütte utf8_unicode_ci kullanan bu testte% 12 daha utf8_general_ci daha yavaştır.

utf8_general_ci ile benchmark_order_by (): 11944 ms
utf8_unicode_ci ile benchmark_order_by (): 12887 ms
utf8_unicode_ci kullanan bu ölçütte utf8_unicode_ci kullanan bu kıyaslama değerinde utf8_general_ci% 7,9 daha yavaştır.


2

Hiçbir karşılaştırma ölçütü görmedim, ancak BENCHMARK işlevini kullanarak kendiniz çalıştırabilirsiniz :

KARŞILAŞTIRMASI (sayım, ifade)

Matthew tarafından tavsiye edildiği gibi, MYSQL'in paralel kurulumunu gerçekleştirebilirsiniz, ancak farklı mimari (sparc, intel, 32bit, 64bit, ...) arasında büyük bir fark olabileceğini düşünün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.