2010-08-02 6 views
1

J'utilise PHP pour interagir avec une base de données MySQL, et je me demandais si interroger MySQL avec un "SELECT * FROM ..." est plus ou moins efficace qu'un "SELECT id FROM ...".MySQL SELECT efficiency

+3

En quoi consistent les downvotes? Si c'est un dupe, laissez des commentaires en le disant. – BoltClock

+1

Pourquoi php dans la question? Ce problème d'efficacité dépend-il de l'interface utilisée pour la requête? – zerkms

Répondre

4

Moins efficace.

Si vous y réfléchissez, SQL enverra toutes les données pour chaque ligne sélectionnée. Imaginez que vous ayez une colonne appelée MassiveTextBlock - cette colonne sera incluse lorsque vous SELECT * et SQL devra donc envoyer toutes ces données lorsque vous n'en aurez pas besoin. En revanche, SELECT id est juste en train de saisir une collection de chiffres.

+0

Ok, je ne savais pas si l'envoi de l'info était un plus grand suceur de performance que de trier et de choisir les bonnes lignes. Merci. – jorgen

+1

@Graphain: nous devons également garder à l'esprit que les personnes qui posent de telles questions ne connaissent rien aux performances et même SELECT id (au lieu de *) n'aidera pas à améliorer les performances des tables sans index et des conditions LIKE '% bla%' ;-) – zerkms

+0

@zerkms: Je ne sais pas ce que cela a à voir avec la réponse de @ Graphain. –

0

Il est moins efficace car vous récupérez beaucoup plus d'informations que l'identifiant SELECT. En outre, la deuxième question est beaucoup plus susceptible d'être servi en utilisant simplement un index.

0

Cela dépend de la raison pour laquelle vous sélectionnez les données. Si vous écrivez une interface de base de données brute comme phpMySQL, alors cela peut avoir du sens.

Si vous faites plusieurs requêtes sur la même table avec les mêmes conditions et opérations de concaténation, puis un SELECT col1, col2 FROM table peut être plus judicieux de le faire que d'utiliser deux indépendants SELECT col1 FROM table et un SELECT col2 FROM table pour obtenir différentes portions des mêmes données, ce effectue les deux opérations dans la même requête. Mais, en général, vous ne devez sélectionner que les colonnes dont vous avez besoin dans la table afin de minimiser les données inutiles à être draguées par le SGBD. Les avantages de cette augmentation considérablement si votre base de données est sur un serveur différent du serveur client, ou si votre serveur de base de données est vieux et/ou lent.

Il n'y a AUCUNE CONDITION dans laquelle un SELECT * est inévitable, mais s'il y en a, alors votre modèle de données a probablement de sérieux défauts de conception.

0

Cela dépend de vos index.

La sélection de moins de colonnes peut parfois faire gagner beaucoup de temps, si vous ne sélectionnez que les colonnes qui existent dans l'index que MySQL a utilisé pour extraire les résultats.

Par exemple, si vous avez un index sur la colonne id, et vous effectuez cette requête:

SELECT id FROM mytable WHERE id>5 

Alors MySQL n'a qu'à lire l'index, et n'a pas besoin de lire, même la ligne du tableau. Si d'autre part, vous sélectionnez des colonnes supplémentaires, comme sur:

SELECT id, name FROM mytable WHERE id>5 

, MySQL besoin de lire l'ID de l'index, puis passez à la ligne de table pour lire la colonne Nom. Cependant, si vous lisez des colonnes qui ne figurent pas dans l'index que vous avez sélectionné, la lecture de plusieurs colonnes ne fera pas vraiment autant de différence, même si cela fera une petite différence. Si certaines colonnes contiennent une grande quantité de données, telles que de grandes colonnes TEXT ou BLOB, il serait judicieux de les exclure si vous n'en avez pas besoin.