IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

CHarset UTF8 et perf


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut CHarset UTF8 et perf
    J'ai un soucis de perf quand je passe en UTF8 :

    J'ai une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE IF NOT EXISTS `doublons` (
          `id` int(11) NOT NULL default '-1',
          `username` varchar(255) default '',
           PRIMARY KEY  (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;";
    J'insert 8000 lignes avec des username qui comportent des doublons. Pour trouver ces doublons j'exécute la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM `doublons` 
    WHERE username  IN (
      SELECT username
      FROM `doublons`
      GROUP BY username
      HAVING count( * ) >1 ) 
    order by username;

    Cette requête prend environ 4min, cependant si je réalise les mêmes étapes en changeant le default charset à UTF-8 le temps d'éxecution passe à plus de 20min !
    En ajoutant un index sur le champs username ça tombe respectivement à environ 1min30 et 2min30.

    Est-ce normal d'avoir un tel écart ? Et sinon dans quelle direction dois-je chercher pour optimiser ça ?

    Je fais mes tests sur la version : 5.0.45-1ubuntu3.1

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Les jeux de caractères Unicode sont plus complexes et donc plus longs que les jeux mono-octet comme latin1. L'écart est donc normal.

    Le fond du problème est que les sous-requêtes IN sont très mal optimisées. Tu as intérêt à réécrire ta sous-requête en jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT D1.* 
    FROM `doublons` D1
      INNER JOIN doublons D2 ON D1.username = D2.username
    GROUP BY D1.username
    HAVING count( * ) >1 ) 
    ORDER BY D1.username;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Merci pour la requête, 1min en UTF8 sans index soit 20x plus rapide .


    Je connais les différents encodages, et l'impact du 'collation' en UTF-8, mais je ne pensais pas que ça pouvait être à ce point, 5x plus lent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. charset utf8 firebird
    Par LuffyBoy_85 dans le forum Firebird
    Réponses: 7
    Dernier message: 24/06/2014, 09h58
  2. [HTML] utf8 et charset=ISO-8859-1 corriger mois si je me trompe
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/04/2008, 10h57
  3. [UTF8] probleme de charset
    Par max44410 dans le forum Langage
    Réponses: 1
    Dernier message: 03/12/2007, 10h13
  4. [MySQL] charset utf8 de base vers PHP
    Par jordy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/09/2006, 17h15
  5. Lire un fichier avec un charset UTF8
    Par Sonic dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/05/2005, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo