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 :

Probleme d'index dans une table


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut Probleme d'index dans une table
    Bonjour à tous,

    J'ai un problème, à priori d'index ?... dans une table.

    J'explique:

    J'ai une table avec 63 rows, avec plusieurs champs, dont 4 indexés :

    Id (Mediumint)
    A (INT)
    B (INT)
    C (INT)
    Lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Id 
    FROM table 
    ORDER BY Id
    La liste s'affiche dans l'ordre des Id, bien entendu, sans aucun problème.

    Pareil pour les autres champs en faisant un ORDER BY A, ou C, mais j'ai une erreur quand je fais par B !?....

    Lorsque je visualise le résultat je me retrouve avec un enregistrement doublé, en clair, j'ai toujours 63 rows, mais j'en ai un en double (Le même Id Apparait 2 fois!?)

    J'ai fait le test sous PhpMyadmin, idem, malgré le fait que la table ne contient bien entendu pas 2 fois le même ID. Cette erreur apparait des fois sur d'autres Id, suivant le ORDER BY que j'utilise.

    J'ai ce problème suite à un plantage de Mysql à cause d'un manque d'espace disque de /

    J'ai essayé de réparer avec Phpmyadmin la table, il me dit que c'est Ok, j'optimise, il me dit que c'est ok, je fais un myisamchk (il m'a dit que la table devait être fixée), j'ai donc fait un myisamchk -r table, il a fixé les index, mais lorsque je redemande un ORDER BY, j'ai toujours la même erreur !?...

    Help ! ... chuis à cours d'idées ... :s

  2. #2
    Membre régulier Avatar de Macfurp
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    S'agit-il d'un index composé des 4 champs Id, a, b, c ou de 4 index distincts ?
    Quel est le critère d'unicité sur la table ?

    Sinon pour avoir le coeur net sur le contenu de la table, tu pourrais passer un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Id, B FROM table ORDER BY B ;

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut
    Pour répondre à tes questions, ce sont 4 index séparés, le champ Id est en auto-incrément.

    Alors, après plein de tests, il semblerait que ce soit un probleme de requete ?...

    Lorsque je fais :

    SELECT Id FROM table ORDER BY B DESC

    Je n'ai pas le même ordre d'affichage que lorsque je fais

    SELECT Id FROM table ORDER BY B DESC LIMIT 0,30

    Bien entendu, sur les 30 premiers. Le classement change d'une requete à l'autre lorsque B==0, sachant que le champ B est de type INT not null.

    En gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Requete1         Requete2
    Id - B           Id - B
    6 - 1000         6 - 1000 
    7 - 990          7 - 990
    2 - 500          2 - 500
    1 - 300          1 - 300
    9 - 0            8 - 0
    8 - 0            5 - 0
    ...              ...
    Comment faire pour avoir exactement le même ordre d'affichage dans les 2 cas ?

    Je ne sais pas si je suis très clair là dans mon explication .... lol.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut
    C'est bon, j'ai trouvé un moyen simple d'avoir toujours le même classement.

    Je donne l'info pour ceux qui éventuellement seraient confrontés au même problème, il suffit d'utiliser en parallèle de la requête de tri un index d'unicité.

    Merci Macfurp pour m'avoir mis sur la piste ..

    Changer les requetes précédentes par:

    SELECT Id,B FROM table ORDER BY B DESC,Id ASC

    Et

    SELECT Id,B FROM table ORDER BY B DESC,Id ASC LIMIT 0,30

    Dans ce cas, y a toujours le même ordre.

    Ca veut dire qu'en fait, suivant si il y a le LIMIT dans la requete ou pas, le parcours de la table ne se fait pas dans le même sens ??...

    Quelqu'un pourrait m'éclairer sur ca, histoire que je me couche moins bête ce soir ?..

  5. #5
    Membre régulier Avatar de Macfurp
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    je crois qu'il y a parfois un problème sur les tris effectués sur une colonne non sélectionnée dans la requète ce qui peut amener des incohérences de résultat.

    Pour le problème sur l'ordre des données ramenées avec ou sans le LIMIT je pense qu'il faudrait comparer les chemins d'accès pour regarder dans chacun des cas l'index qui est utilisé et voir s'il y a une différence.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par Macfurp Voir le message
    je pense qu'il faudrait comparer les chemins d'accès pour regarder dans chacun des cas l'index qui est utilisé et voir s'il y a une différence.
    Y a autre chose qu'un explain pour voir ca plus précisément ? ..

Discussions similaires

  1. [Conception] probleme de recherche dans une table
    Par H-bil dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/02/2007, 16h23
  2. creation d'index dans une table déja remplie
    Par khalux dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/01/2007, 16h24
  3. [Conception] probleme d'enregistrement dans une table
    Par k_boy dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 28/05/2006, 23h38
  4. mise a zéro de la clé d'index dans une table
    Par Atchoum_002 dans le forum Access
    Réponses: 2
    Dernier message: 19/09/2005, 15h34
  5. [interbase6]probleme d'insertion dans une table
    Par macadam314 dans le forum Bases de données
    Réponses: 10
    Dernier message: 22/02/2005, 14h21

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