[mysql] LIMIT utile sur un champ indexé ?

WRInaute impliqué
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 !
 
WRInaute passionné
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.
 
WRInaute impliqué
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.
 
WRInaute impliqué
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.
 
WRInaute impliqué
En lisant cette page de la documentation MySQL sur les index, j'en ressort ceci :

Si la table dispose d'un index pour les colonnes utilisées, MySQL peut alors trouver rapidement les positions des lignes dans le fichier de données, sans avoir à fouiller toute la table

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 :
Notez que dans certains cas, MySQL ne va pas utiliser un index, même s'il y en a un disponible. Si l'utilisation de l'index requiert que MySQL accède à plus de 30% des lignes de la table (dans ce cas, un scan de table est probablement plus rapide, et demandera moins d'accès disques). Notez que si une telle requête utilise la clause LIMIT pour ne lire qu'une partie des lignes, MySQL utilisera tout de même l'index, car il va trouver plus rapidement les quelques lignes de résultat.

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.
 
WRInaute passionné
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 ).
 
WRInaute impliqué
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.
 
Discussions similaires
Haut