2008-10-10 8 views
2

Compte tenu d'une structure de table comme ceci:l'utilisation de LIMIT lors de la recherche par un champ unique

CREATE TABLE `user` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `name` varchar(32) NOT NULL, 
    `username` varchar(16) NOT NULL, 
    `password` char(32) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username` (`username`) 
); 

est-il utile à utiliser le mot-clé LIMIT lors de la recherche par nom d'utilisateur, ou est suffisamment intelligent DB de savoir qu'il peut y seulement peut-être un résultat, et donc arrêter de chercher une fois qu'il est trouvé un?

SELECT * FROM `user` WHERE `username` = 'nick'; 

-- vs -- 

SELECT * FROM `user` WHERE `username` = 'nick' LIMIT 1; 

Mise à jour: Merci pour les réponses, ils ont été instructifs. Il semble que, même si c'est inutile, mettre LIMIT 1 sur la requête ne fait pas de mal, et augmente probablement la lisibilité (vous n'avez pas besoin d'aller regarder dans le schéma DB pour savoir qu'un seul sera retourné). Shoutout spécial pour la réponse de JR - Je ne savais même pas que vous pourriez le faire avec des indices.

En outre, il y a une question similaire, j'ai trouvé here, qui pourrait également aider.

Répondre

2

On m'a toujours dit et lu que vous devriez inclure le LIMIT chaque fois que vous voulez seulement 1 résultat. Cela dit juste à la DB qu'il devrait s'arrêter si important. Dans votre cas, vous avez probablement raison de dire que cela ne fait pas de différence, mais je pense qu'il est préférable de toujours faire que de toujours décider et de le laisser de côté une fois que vous en avez besoin.

1

L'optimiseur de requête sql devrait être assez intelligent pour comprendre cela.

+0

:-D "devrait" est agréable mais pas une réponse –

3

Il n'est pas nécessaire d'utiliser LIMIT. Cependant, si vous avez une cardinalité ÉNORME ÉNORME sur la table (et que vous vous inquiétez de la vitesse), vous pouvez ne pas utiliser la contrainte spéciale UNIQUE dans la base de données et la gérer à partir de votre application. Ensuite, vous pouvez spécifier un INDEX sur seulement les premiers caractères de votre champ de nom d'utilisateur. Cela réduira drastiquement la taille de votre index, en s'assurant que le tout s'intègre dans la RAM, et peut-être accélérer vos requêtes.

Ainsi, vous pouvez essayer:

CREATE TABLE `user` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `name` varchar(32) NOT NULL, 
    `username` varchar(16) NOT NULL, 
    `password` char(32) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `username` (`username`(4)) 
); 

comme alternative si votre première tentative se révèle être trop lent. Cela signifie, bien sûr, que vous devez vérifier les noms d'utilisateur en double avant de les insérer, mais vous devrez probablement le faire de toute façon pour indiquer à l'utilisateur qu'il doit choisir un autre nom d'utilisateur. En fonction du serveur et du moteur de base de données que vous utilisez, il peut également être plus rapide de spécifier des champs de largeur fixe pour toutes vos chaînes. Au lieu de varchar, utilisez char.

Questions connexes