2010-04-20 7 views
1

J'ai une variable classified_id qui correspond à un document dans une table MySql.Quelle ligne MySql est la plus rapide:

J'aller chercher actuellement les informations à ce sujet un enregistrement comme celui-ci:

SELECT * FROM table WHERE table.classified_id = $classified_id 

Je me demande s'il y a une approche plus rapide, par exemple comme ceci:

SELECT 1 FROM table WHERE table.classified_id = $classified_id 

Wont le dernier seulement sélectionnez 1 enregistrement, qui est exactement ce dont j'ai besoin, de sorte qu'il ne doit pas analyser la table entière, mais à la place arrête de chercher des enregistrements après que 1 est trouvé?

Ou suis-je en train de rêver?

Merci

+0

Existe-t-il une contrainte de clé unique ou primaire sur 'classified_id'? – Thomas

Répondre

6

Vous voulez utiliser LIMIT:

SELECT * FROM table WHERE table.classified_id = $classified_id LIMIT 1 
+0

cela va-t-il améliorer les performances? –

+0

@ Camran - Difficile à dire, votre version actuelle va littéralement sélectionner "1", un résultat d'une colonne sur une ligne, cela sélectionnera en fait le premier enregistrement, ce qui semble être ce que vous voulez ... mais c'est un résultat différent. Vous n'obtiendrez pas une performance * meilleure * (ou plus simple) que celle-ci, donc j'irais avec. –

+0

@John, je dirais que ce n'est pas la réponse, la question indique qu'il n'y a qu'un seul enregistrement satisfaisant la requête, donc LIMIT ne fera aucune différence – Unreason

2

Vous devriez ajouter un index à la colonne classified_id pour éviter un balayage de table.

CREATE INDEX classified_idx ON table (classified_id); 
+1

+1 Toujours bon conseil –

+1

Pas toujours bien. Avec beaucoup d'inserts, il peut faire de mauvaises choses –

+0

D'accord avec 'Col. Shrapnel', pourrait être une mauvaise idée lorsque le champ est la clé primaire. OP a mentionné que la valeur du champ identifiait la ligne de façon unique. – newtover

4

Oui, vous rêvez de cela.
Il y a 2 défauts majeurs dans votre raisonnement:

  1. La question elle-même. La plupart des débutants ne parviennent pas à ce trou. Ils demandent "et si je fais quelque chose - sera-t-il plus rapide?". Mais la bonne question est "Mon application tourne lentement, comment trouver un goulot d'étranglement?" et "J'ai un certain goulot d'étranglement: comment l'éliminer?"
  2. Vous supposez que la partie fieldlist influence la recherche dans la base de données. C'est faux. La liste des champs est responsable uniquement des champs retournés des lignes trouvées. Dans les deux cas, le nombre de lignes serait le même.
2

Pourquoi ne pas l'essayer?

SELECT 1 FROM table; 

rendements

+---+ 
| 1 | 
+---+ 
| 1 | 
| 1 | 
| 1 | 
| 1 | 
| 1 | 
| 1 | 
+---+ 
6 rows in set (0.00 sec) 

qui est une colonne calculée, une valeur constante de l'un, dans ce cas (pour l'ensemble des 6 lignes dans mon cas de test).

Pour votre question

SELECT * FROM table WHERE table.classified_id = $classified_id 

c'est le meilleur moyen de récupérer des données (en supposant que vous avez besoin de toutes les colonnes de la table)

Il y a des choses suivantes que vous pouvez faire:

  • Vérifiez s'il y a un index sur classified_id, s'il y a et si l'index est plus rapide, la base de données utilisera l'index et ne balaiera pas la table entière, ainsi vous obtiendrez ce que vous voulez être plus lent s'il n'y a que quelques enregistrements ou si un pourcentage élevé d'enregistrements satisfait à un critère, mais que l'index n'apporte aucune pénalité à la lecture des données, la base de données choisira le meilleur moyen de le récupérer)
  • si vous ne le faites pas besoin de toutes les colonnes de la table indiquez alors exactement ceux que vous avez besoin
  • s'il y a plus d'un dossier qui satisfont aux critères que vous pouvez utiliser mot-clé LIMIT pour obtenir seulement un ou seulement quelques enregistrements

autres alors Pour une requête aussi simple, la seule étape suivante serait de partitionner la table en plusieurs disques durs (ce qui pourrait ne pas être une option sur votre système).

Questions connexes