[mysql] LIMIT utile sur un champ indexé ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par rikew, 8 Décembre 2010.

  1. rikew
    rikew WRInaute impliqué
    Inscrit:
    19 Décembre 2002
    Messages:
    683
    J'aime reçus:
    2
    Bonjour,

    Imaginons une table contenant des utilisateurs.
    La table user contient 2 champs : user_id et user_dep
    user_dep contient le numéro d’un département et pour accélérer les recherches il y a un index sur ce champ.

    Admettons que je veuille lister les utilisateurs inscrits par exemple dans le 75. Je sais avant de faire la requête qu’il y a 123 personnes dans le 75 (parceque je mets en cache cette donnée). Cela peut-il accélérer la requête d’ajouter un ‘limit 123’ ou bien ça ne sert à rien car il y a un index sur le champ (et que mysql ne va pas utiliser mon ‘limit 123’ car il sait déjà qu’il y en a 123) ?

    Merci !
     
  2. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    un EXPLAIN te donnera plus d'infos là dessus.

    Je ne suis pas sûr, perso j'en mets toujours ça ne ralentira pas la requête de mettre le LIMIT, mais j'ignore si ça l'accélerera.
    Des benchmarks pourraient être nécessaires.
     
  3. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    De mon avis, je pense que le limit n'est pas utile si ta requête est simple.
    Il faut faire attention, ce n'est pas parce que tu as mis un index sur un champ qu'il sera forcément utilisé. Cela dépend de la requête effectué.
    Seul un EXPLAIN te le dira, comme la fait remarquer Julia41.

    Le limit peut ne pas être nécessaire. C'est comme utilisé un "limit 1" quand tu cherches sur une clé primaire. MySQL sait qu'un champ primaire est unique, inutile de lui dire.
     
  4. rikew
    rikew WRInaute impliqué
    Inscrit:
    19 Décembre 2002
    Messages:
    683
    J'aime reçus:
    2
    Merci !

    Je ne suis pas un as de l'EXPLAIN

    Il utilise bien mon index par contre apriori EXPLAIN ne précise pas si LIMIT est utilisé dans la requête. Même en supprimant l'index sur le champ il se contente d'indiquer seulement : "Extra = Using where; Using filesort" pas de "Using limit".

    Oui dans le cas de clé primaire ou index 'unique' je ne mets pas de limit 1. Mysql sait qu'il n'y a qu'un enregistrement à trouver.

    Mais dans ce cas précis je me demande si ajouté un Limit ne pourrait pas servir à mysql ... ou si il en a rien à faire car dans l'index en plus de stoquer une liste il stoque le nombre d'enregistrement et si nombre d'enregistrements <= limit alors il ignore le limit. Dans tous les cas si on place un limit il y déjà forcement une comparaison entre ce nombre et le nombre total dans l’index … du coup je serais tenté de ne pas en mettre mais en même temps si ça peut être utile à mysql …

    Faudrait peut-être faire un benchmarks mais perso je n’en ai jamais fait et je ne sais pas trop comment m’y prendre … sachant que MySQL utilise en plus un cache de requête comment faire un benchmark proprement et qui apporte une réponse oui/non …là c’est pas dans mes compétences.
     
  5. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    En lisant cette page de la documentation MySQL sur les index, j'en ressort ceci :

    Donc, on effectuant une recherche sur une colonne indexé avec WHERE, MySQL regarde dans les index afin de trouver la position des lignes. Il sait donc automatiquement le nombre de ligne à récupérer.
    Dans ce cas, il serait inutile de préciser le LIMIT.

    Par contre, on peut lire aussi :
    Donc, MySQL utiliserait LIMIT directement sur l'index d'après ce texte.

    En claire, c'est un peu flou;
    Je dirais que si ta table contient peu d'information (c'est relatif, 10000 lignes peut être considéré comme peu) alors pas besoin du LIMIT. Par contre, si tu as beaucoup d'informations, il peut être intéressant de voir ce que donne l'utilisation du LIMIT.
     
  6. anemone-clown
    anemone-clown WRInaute passionné
    Inscrit:
    11 Novembre 2007
    Messages:
    1 577
    J'aime reçus:
    20
    Bonjour,

    pour compléter la réponse de Blount, le type de données auxquelles on accède a également son importance : entre accéder à 65000 enregistrements de shortint et 10000 enregistrements de text, c'est le 65000 qui gagne... Le volume de la transaction a une importance.

    A priori, les deux champs de données auxquels tu vas accéder sont de type numérique : les index sont quasi inutiles et on se fiche un peu du limit si la requête accède juste aux données (et pas de façon bourrin avec une * :-D ).
     
  7. rikew
    rikew WRInaute impliqué
    Inscrit:
    19 Décembre 2002
    Messages:
    683
    J'aime reçus:
    2
    Merci !

    Dans mon cas l'index est utile puisque utilisé systématiquement. Il y a 1 500 000 enregistrements dans la table. Je vais quand même placer le limit. Ça ne coute pas grand-chose et si un jour MySQL « pete un câble » et ne l’utilise pas alors il y aura quand même un limit pour lui dire de stopper.
     
Chargement...
Similar Threads - [mysql] LIMIT utile Forum Date
Limiter la taille des bases de données. [Mysql] Administration d'un site Web 9 Mars 2006
[résolu][mysql] faire un "NOT LIKE" sur une chaîne contenant des / Développement d'un site Web ou d'une appli mobile 25 Octobre 2014
[MySQL] Liste (select) avec des lignes au hasard Développement d'un site Web ou d'une appli mobile 23 Octobre 2014
[MySQL] Requête SELECT et INSERT entre 3 tables liées+Aide Développement d'un site Web ou d'une appli mobile 30 Avril 2014
[MySQL] Nombre d'enregistrements sur des horaires précis Développement d'un site Web ou d'une appli mobile 19 Juillet 2013
[MYSQL] Comment remplacer caractères dans tous les champs de toutes les tables d'une base? Développement d'un site Web ou d'une appli mobile 11 Juillet 2013
[MYSQL] Une sorte de "OR JOIN" ? Développement d'un site Web ou d'une appli mobile 5 Juillet 2013
[MySQL] sélectionner la dernière note pour chaque élève en une seule requète ? Développement d'un site Web ou d'une appli mobile 12 Avril 2012
[Mysql] Requête PDO avec variable php Développement d'un site Web ou d'une appli mobile 16 Février 2012
[Mysql] Requête PDO aléatoire Développement d'un site Web ou d'une appli mobile 7 Février 2012
[MYSQL] Tri par date Développement d'un site Web ou d'une appli mobile 7 Septembre 2011
[MySQL] rechercher une valeur dans un champ sérialisé Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] Requête SELECT entre 3 tables liées Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] addslashes et stripslashes Développement d'un site Web ou d'une appli mobile 9 Août 2011
[résolu] [mysql] Conditions WHERE avec AND et OR Développement d'un site Web ou d'une appli mobile 13 Mai 2011
[mysql] trier les résultats d'une requête selon une table non liée à la requête Développement d'un site Web ou d'une appli mobile 15 Avril 2011
[résolu] [mysql] passer un champ à une valeur donnée pour tous les enregistrements Développement d'un site Web ou d'une appli mobile 25 Mars 2011
[MySQL] INSERT / UPDATE conditionnel Développement d'un site Web ou d'une appli mobile 1 Février 2011
[mySQL] Découper une table et gagner en performance ? Développement d'un site Web ou d'une appli mobile 9 Janvier 2010
[MySQL] Récupérer la première ligne d'un GROUP BY Développement d'un site Web ou d'une appli mobile 14 Décembre 2009