MIN / MAX vs ORDER BY et LIMIT

Parmi les requêtes suivantes, quelle méthode considéreriez-vous la meilleure? Quelles sont vos raisons (efficacité du code, meilleure maintenabilité, moins de WTFery) …

SELECT MIN(`field`) FROM `tbl`; SELECT `field` FROM `tbl` ORDER BY `field` LIMIT 1; 

Dans le pire des cas, lorsque vous examinez un champ non indexé, l’utilisation de MIN() nécessite un seul passage complet de la table. L’utilisation de SORT et LIMIT nécessite un port de fichiers. Si on le compare à une grande table, il y aurait probablement une différence significative dans la performance perçue. En tant que sharepoint données sans signification, MIN() pris 0,36 tandis que SORT et LIMIT pris 0,84 sur un tableau de 106 000 lignes sur mon serveur de développement.

Si, toutefois, vous examinez une colonne indexée, la différence est plus difficile à remarquer (le sharepoint données sans signification est de 0,00 dans les deux cas). En regardant la sortie d’expliquer, il semble que MIN() puisse simplement extraire la plus petite valeur de l’index (les lignes “Sélectionner les tables optimisées” et “NULL”) alors que SORT et LIMIT encore besoin de faire une traversée ordonnée de l’index (106 000 lignes). L’impact réel sur la performance est probablement négligeable.

Il semble que MIN() soit la solution – plus rapide dans le pire des cas, impossible à distinguer dans le meilleur des cas, SQL standard et exprimant le mieux la valeur que vous essayez d’obtenir. Le seul cas où il semblerait souhaitable d’utiliser SORT et LIMIT serait, comme l’a dit mson , d’écrire une opération générale qui trouve les valeurs N supérieures ou inférieures de colonnes arbitraires et cela ne vaut pas la peine d’écrire le cas spécial. opération.

 SELECT MIN(`field`) FROM `tbl`; 

Simplement parce que c’est compatible avec ANSI. Limite 1 est particulière à MySQL, car TOP est destiné à SQL Server.

Comme l’ont souligné moine et Sean McSomething , MIN est préférable.

Une autre raison pour laquelle ORDER BY + LIMIT est utile est si vous souhaitez obtenir la valeur d’une colonne différente de celle de la colonne MIN.

Exemple:

 SELECT some_other_field, field FROM tbl ORDER BY field LIMIT 1 

Je pense que les réponses dépendent de ce que vous faites.

Si vous avez une requête 1 et que l’intention est aussi simple que vous l’avez spécifiée, sélectionnez min (field) est préférable.

Cependant, il est courant que ces types d’exigences se transforment en – saisir les n résultats, saisir les résultats du nième, etc.

Je ne pense pas que ce soit une idée terrible de s’engager dans votre firebase database choisie. Changer de dbs ne doit pas être fait à la légère et doit être révisé est le prix que vous payez lorsque vous effectuez ce déménagement.

Pourquoi se limiter maintenant, pour la douleur que vous pouvez ou ne pouvez pas ressentir plus tard?

Je pense que c’est bien de restr ANSI autant que possible, mais ce n’est qu’une directive …

Compte tenu des performances acceptables, j’utiliserais le premier car il est sémantiquement plus proche de l’intention.
Si la performance posait problème, (la plupart des optimiseurs modernes optimaliseront probablement les deux pour le même plan de requête, bien que vous ayez à tester pour vérifier cela) alors, bien sûr, j’utiliserais le plus rapide.