Esiste un benchmark delle prestazioni di MySQL per misurare l'impatto di utf8_unicode_ci rispetto a utf8_general_ci?


13

Ho letto qua e che l'uso delle utf8_unicode_ciregole di confronto garantisce un trattamento migliore del testo unicode (ad esempio, sa come espandere caratteri come "œ" in "oe" per la ricerca e l'ordinamento) rispetto al valore predefinito utf8_general_ciche sostanzialmente elimina i segni diacritici. Sfortunatamente, entrambe le fonti indicano che utf8_unicode_ciè leggermente più lento di utf8_general_ci.

Quindi la mia domanda è: cosa significa "leggermente più lento"? Qualcuno ha eseguito benchmark? Stiamo parlando di un impatto sulle prestazioni del -0,01% o piuttosto del 25%?

Grazie per l'aiuto.


Per quanto riguarda un benchmark, perché non utilizzare il tempo di query? Potrei essere un idiota, ma cosa succede se si esegue una VM e si verifica il tempo di query su una query complessa di grandi dimensioni per entrambe le codifiche dei caratteri? (Non ho mai visto benchmarking fatto per questo prima)
Ablue

Risposte:


8

Bene, non ho trovato alcun benchmark su Internet, quindi ho deciso di fare da solo i benchmark.

Ho creato una tabella molto semplice con 500000 righe:

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

Quindi l'ho riempito con dati casuali eseguendo questa procedura memorizzata:

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

Quindi ho creato le seguenti stored procedure per eseguire il benchmark di SELECT, SELECT con LIKE e ordinamento semplici (SELECT con 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

Nelle procedure memorizzate sopra viene utilizzata la raccolta utf8_general_ci, ma ovviamente durante i test ho usato sia utf8_general_ci che utf8_unicode_ci.

Ho chiamato ogni procedura memorizzata 5 volte per ogni confronto (5 volte per utf8_general_ci e 5 volte per utf8_unicode_ci) e quindi ho calcolato i valori medi.

Ecco i risultati:

benchmark_simple_select () con utf8_general_ci: 9957 ms
benchmark_simple_select () con utf8_unicode_ci: 10271 ms
In questo benchmark l'utilizzo di utf8_unicode_ci è più lento di utf8_unicode_ci del 3,2%.

benchmark_select_like () con utf8_general_ci: 11441 ms
benchmark_select_like () con utf8_unicode_ci: 12811 ms
In questo benchmark l'utilizzo di utf8_unicode_ci è più lento di utf8_general_ci del 12%.

benchmark_order_by () con utf8_general_ci: 11944 ms
benchmark_order_by () con utf8_unicode_ci: 12887 ms
In questo benchmark l'utilizzo di utf8_unicode_ci è più lento di utf8_general_ci del 7,9%.


2

Non ho visto alcun benchmark, ma puoi eseguire il tuo utilizzando la funzione BENCHMARK :

BENCHMARK (conteggio, espressione)

Come consigliato da Matthew, potresti eseguire un'installazione parallela di MYSQL, ma considera che potrebbe esserci un'enorme differenza tra diverse architetture (sparc, intel, 32bit, 64bit, ...).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.