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

 MySQL Discussion :

index et cardinalité


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut index et cardinalité
    D'abord bonjour

    J'ai un problème avec Mysql et Phpmyadmin, je ne sais pas si c'est l'un ou l'autre qui délire, mais on dit aussi souvent (a juste titre) que c'est parfois l'utilisateur qui fait n'importe quoi.

    Alors, je vous expose mon soucis.
    J'ai créer une table de donnée toute simple via Phpmyadmin sur Mysql.

    Table: id - mail - insertion (id: primary key, autoincrement)
    Moteur de stockage : InnoDB

    J'ai un script en php qui lit un fichier texte et insère dans la table chaque ligne du fichier parcourut.
    Le fichier est lu, toutes les données ont été insérer (362000 lignes).
    Jusque la tout va bien.

    Je retourne sur phpmyadmin, fait un affichage simple de la table et la il me renseigne :
    Affichage des enregistrements 0 - 29 (350 879 total, traitement: 0.0003 sec.)
    pas le même nombre attendu, je refait un affichage :
    Affichage des enregistrements 0 - 29 (365 354 total, traitement: 0.0006 sec.)
    La c'ets plus que ce que j'attendais
    etc...

    Trouvant ca légèrement farfelu, j'essaie d'atteindre les dernières pages via le système de pagination de phpmyadmin, dans le cas ou le nombre total d'enregistrements est plus petit, ca s'affiche, dans l'autre cas, MySQL n'a retourné aucun enregistrement (normal ayant dépassé le total de lignes)

    J'ai regardé alors la valeur de l'autoincrement, elle est bien à 362001, et fait un select count(*), là aussi j'ai le bon résultat 362000.

    Par contre en faisant plusieurs SHOW INDEX FROM table,
    phpmyadmin affiche:
    Table -> table
    Non_unique -> 0
    Key_name -> primary
    Seq_in_index -> 1
    Column_name -> id
    Collation -> A
    Cardinality -> 358 657 ou 366 468 ou 361 135, etc ...

    J'ai pu lire que l'index était limitée en taille, mais ca me parait peu 300 000 lignes, surtout que j'ai aussi lu que InnoDB était large comme utilisation.

    Peut on augmenté la taille de l'index ? ou peut etre que ma table est mal construite ? est-ce tout simplement une erreur d'affichage phpmyadmin ou mysql ?

    J'ai peur qu'en partant sur une table mal lue, mes futurs script de selection, modification, suppression soient à l'avance erronées.

    Plof

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Bizarre ton histoire !
    Ce n'est sûrement pas un problème de taille d'index avec une table de cette taille là. J'ai travaillé avec des tables de plusieurs dizaines de millions de lignes sans problème.
    A tout hasard essaie d'optimiser la table (onglet Opérations dans phpMyAdmin).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Merci de prendre du temps pour répondre.

    Alors j'ai déjà regardé dans l'onglet opération.
    J'ai fait un check de la table, tout est correct.
    J'ai une défragmentation de la base, une optimisation et un recharge de la table.
    Toujours le même soucis.

    Me suis passé pour tester à 25000 lignes, toujours instables au niveau des cardinalité de l'index.

    Est ce que l'insertion requete mysql_query() n'irait pas trop vite par rapport au temps d'execution de mysql ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je ne comprends pas ce que tu veux dire ici :
    Citation Envoyé par plof93 Voir le message
    Me suis passé pour tester à 25000 lignes, toujours instables au niveau des cardinalité de l'index.

    Est ce que l'insertion requete mysql_query() n'irait pas trop vite par rapport au temps d'execution de mysql ?
    D'autant plus que tu as dit aussi précédemment :
    J'ai un script en php qui lit un fichier texte et insère dans la table chaque ligne du fichier parcourut.
    Le fichier est lu, toutes les données ont été insérer (362000 lignes).
    Jusque la tout va bien.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Oui, pas très claire effectivement.

    Je voulais dire par
    Me suis passé pour tester à 25000 lignes, toujours instables au niveau des cardinalité de l'index
    que j'ai modifié mon fichier texte, au lieu d'avoir 300 000 lignes, j'en ai mis que 25 000. Après l'execution de mon script, j'avais toujours mon index qui variait entre 24000 et 26000 en nombre de cardinalité.


    Aussi, par rapport à la question que je me posais
    Est ce que l'insertion requete mysql_query() n'irait pas trop vite par rapport au temps d'execution de mysql ?
    J'ai fait un test dans ma boucle d'insertion (cette fois ci mon fichier texte parcourut fait 60 000 lignes), toutes les 10000 mysql_query("insert into table ....") je fais une pause de 5 secondes.
    Cette fois si je n'ai plus d'index/cardinalité changeant.
    L'index reste stable mais par contre il est supérieure au nombre de ligne/autoincrement.
    Affichage des enregistrements 0 - 29 (60 203 total)
    autoincrement : 60 001
    select count(*) : 60 000
    show index from table : cardinality -> 60 203

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Vraiment bizarre ce truc !
    Tu as une vieille version complètement buggée ou quoi ?

    Ceci dit, dans la doc de MySQL au chapitre sur SHOW INDEX, on lit ceci (avec une belle faute à exact) :
    • Cardinality
      Le nombre de valeurs uniques dans l'index. C'est une valeur qui est mise à jour avec la commande ANALYZE TABLE ou myisamchk -a. Cardinality est compté en se basant sur des statistiques entières : il n'est pas toujours exacte pour les petites tables.
    Du moment que le COUNT(*) est juste et que toutes les données sont là, le problème est sans doute mineur.

    Sinon à ce sujet :
    J'ai un script en php qui lit un fichier texte et insère dans la table chaque ligne du fichier parcourut.
    Le fichier est lu, toutes les données ont été insérer (362000 lignes).
    Ton script fait un traitement particulier sur les données du fichier texte ?
    Si ce n'est pas le cas, plutôt que 360 000 INSERT INTO, regarde du côté de LOAD DATA INFILE. C'est beaucoup plus rapide !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. N'importe quoi sur la cardinalité d'un index
    Par Ceubex dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/06/2015, 08h56
  2. [index] Probleme cardinalite index
    Par tropik972 dans le forum MySQL
    Réponses: 4
    Dernier message: 04/10/2010, 09h06
  3. Index et cardinalité
    Par tiboel dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/03/2006, 06h35
  4. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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