Question Existe-t-il un test de performances MySQL permettant de mesurer l'impact d'utf8_unicode_ci par rapport à utf8_general_ci?


J'ai lu ici et  qu'en utilisant le utf8_unicode_ci le classement assure un meilleur traitement du texte unicode (par exemple, il sait comment développer des caractères tels que "œ" dans "oe" pour la recherche et le classement) par rapport à la valeur par défaut utf8_general_ci qui ne fait que dépouiller les signes diacritiques Malheureusement, les deux sources indiquent que utf8_unicode_ci est légèrement plus lent que utf8_general_ci.

Ma question est donc la suivante: que signifie "légèrement plus lent"? Quelqu'un at-il courir des points de repère? Parlons-nous d'un impact sur les performances de -0,01% ou plutôt de quelque chose comme -25%?

Merci de votre aide.


12
2017-07-05 10:05


origine


En ce qui concerne la référence, pourquoi ne pas utiliser le temps de requête? Je suis peut-être un idiot, mais que se passe-t-il si vous exécutez une machine virtuelle et testez le temps de la requête sur une requête complexe et volumineuse pour les deux encodages de caractères? (Je n'ai jamais vu de benchmarking pour cela auparavant) - Ablue


Réponses:


Eh bien, je n’ai trouvé aucun repère sur Internet, j’ai donc décidé de le faire moi-même.

J'ai créé un tableau très simple avec 500 000 lignes:

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

Ensuite, je l'ai rempli avec des données aléatoires en exécutant cette procédure stockée:

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

Ensuite, j'ai créé les procédures stockées suivantes pour évaluer simplement SELECT, SELECT avec LIKE et le tri (SELECT avec 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

Dans les procédures stockées ci-dessus, le classement utf8_general_ci est utilisé, mais bien sûr, lors des tests, j'ai utilisé à la fois utf8_general_ci et utf8_unicode_ci.

J'ai appelé chaque procédure stockée 5 fois pour chaque classement (5 fois pour utf8_general_ci et 5 fois pour utf8_unicode_ci), puis j'ai calculé les valeurs moyennes.

Voici les résultats:

benchmark_simple_select () avec utf8_general_ci: 9957 ms
benchmark_simple_select () avec utf8_unicode_ci: 10271 ms
Dans ce test, utiliser utf8_unicode_ci est plus lent que utf8_general_ci de 3,2%.

benchmark_select_like () avec utf8_general_ci: 11441 ms
benchmark_select_like () avec utf8_unicode_ci: 12811 ms
Dans ce test, utiliser utf8_unicode_ci est plus lent que utf8_general_ci de 12%.

benchmark_order_by () avec utf8_general_ci: 11944 ms
benchmark_order_by () avec utf8_unicode_ci: 12887 ms
Dans ce point de référence, utf8_unicode_ci est plus lent que utf8_general_ci de 7,9%.


7
2018-03-02 02:50



Juste ce que je cherchais, merci! - MiniQuark


Je n'ai pas vu de repère, mais vous pouvez exécuter le vôtre à l'aide du RÉFÉRENCE une fonction:

BENCHMARK (compter, expr)

Comme conseillé par Matthew, vous pouvez exécuter une installation parallèle de MYSQL, mais considérez qu’il peut exister une énorme différence entre différentes architectures (sparc, intel, 32 bits, 64 bits, ...).


2
2018-01-03 10:44