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 :

Gestion de l'AUTOINCREMENT


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 73
    Points : 58
    Points
    58
    Par défaut Gestion de l'AUTOINCREMENT
    Bonjour,

    Je lisais cette article que je trouve intéressant d'un point de vue optimisation :
    La clause LIMIT :

    Cette clause très particulière est très souvent utilisée en cas de besoin de paginer les résultats (forum par exemple). C'est entre autres elle qui est responsable de la lenteur des forums dont je vous parlerai plus bas dans cet article. La clause LIMIT permet de limiter le nombre d'enregistrements retournés par MySQL. Reprenons notre requête d'affichage des pseudos des membres. Plus le nombre de membres va augmenter, plus il va devenir important de fractionner par pages l'affichage de la liste des membres sous peine d'avoir des milliers de membres à afficher d'un coup (ce qui n'est pas vraiment recommandé pour le serveur web, ni pour le visiteur qui devra télécharger la page générée...). Si nous souhaitons afficher les 20 premiers membres, nous pourrons utiliser une clause LIMIT, la requête sera celle-ci : SELECT pseudo FROM membres LIMIT 20

    Si nous souhaitons récupérer les 20 membres à partir du 40ème, nous procèderons comme ceci :

    SELECT pseudo FROM membres LIMIT 40,20

    Le premier nombre correspond au nombre d'enregistrements qu'il faut sauter avant d'afficher le nombre d'enregistrements correspondant au second nombre (20 dans notre cas). Or, le gros problème de cette requête est qu'elle va sélectionner toutes les valeurs de la table avant de "faire le tri" à savoir avant d'envoyer les 20 enregistrements à PHP. Or sélectionner des milliers d'enregistrements est très, très long. C'est pour ça que les forums peu optimisés fonctionnent rapidement à leur ouverture, les performances se dégradant nettement au fur et à mesure que les membres postent des messages.

    Solution optimisée :

    La table membres que nous avons crée contient un champ nommé id_membre en AUTOINCREMENT. Ce type de champ nécessite un index pour pouvoir être appliqué à une table. Nous allons voir ci dessous ce qu'est un index, sachez qu'il accélère, quand il est bien conçu, les requêtes de sélection. Chaque membre aura donc un numéro différent, le numéro du prochain membre à s'inscrire sera incrémenté par rapport au précédent. Nous pouvons donc utiliser ce champ pour notre requête de sélection. Nous allons supprimer la clause LIMIT et utiliser un BETWEEN à la place. Le BETWEEN permettra de recueillir uniquement les valeurs que nous souhaitons sans parcourir toute la table inutilement. La requête devient ceci (il est très important d'avoir un index sur le champ id_membre sous peine de n'obtenir que de faibles gains) :

    SELECT pseudo FROM membres WHERE id_membre BETWEEN 40 AND 60

    Cette requête permettra de récupérer 20 membres (60-40 = 20) tous situés après le 39ème membre (car le premier id du membre qui sera récupéré portera la valeur 40). Le seul inconvénient de cette méthode est que si vous supprimez par exemple un membre dont l'id est situé entre ces deux valeurs, vous ne récupèrerez plus que 19 enregistrements au lieu de 20. Le jeu en vaut la chandelle à mon avis, et votre serveur vous remerciera. Pour les serveurs non compatibles avec le BETWEEN, sachez que la requête ci-dessus est équivalente à ceci :

    SELECT pseudo FROM membres WHERE id_membre > 40 AND id_membre < 60

    Source : http://www.vulgarisation-informatiqu...iser-mysql.php
    Néanmoins, le problème qui se pose est le suivant :

    Le seul inconvénient de cette méthode est que si vous supprimez par exemple un membre dont l'id est situé entre ces deux valeurs, vous ne récupèrerez plus que 19 enregistrements au lieu de 20.
    Quelle solution pour remédier à ce problème ?

    Merci beaucoup pour votre aide,
    Metallic-84s

  2. #2
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Quand on utilise un champ à auto_increment, la seule hypothèse que l'on peut affirmer c'est qu'il sera unique.

    C'est pour cela qu'utiliser un champ comme celui ci en essayant qu'il soit croissant et que les chiffres se suivent est une erreur classique.

    Si tu ne veux pas qu'il y ai de trou dans ce champ il ne faut pas supprimer d'enregistrement ou sinon il faut tous les enlever et tous les reinserer sauf celui que tu veux supprimer. Mais la aussi attention car ton id ne commencera pas à 1 obligatoirement.

    Ce que je te conseille est d'utiliser une autre colonne 'num_enregistrement' par exemple ou tu regenereras tes chiffres à chaque modif. (c'est une solution parmis tant d'autres)


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  2. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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