Considérons un tableau de valeurs et de hachages, comme ceci:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
La requête suivante se termine en 0,00 secondes:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Cependant, cette requête prend 3 min 17 secondes:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Je vois que pendant que la requête est en cours d'exécution, la liste des processus l'affiche comme état Sorting result. La situation est parfaitement reproductible. Notez qu'un autre processus effectue des INSERTopérations sur la table en continu.
Pourquoi la requête plus spécifique prendrait-elle plus de temps à s'exécuter que la *requête? J'ai toujours pensé que les *requêtes devaient être évitées spécifiquement pour des raisons de performances.
ORDER BY NUMBERsyntaxe est assez sujette aux erreurs.
SELECT *combiné avec un index de colonne dans ORDER BYest obscurcissant quelle colonne est triée - une autre raison d'éviter *s ...
*n'est pas explicite. Donc dire "donnez-moi toutes les colonnes et triez par la troisième" est à peu près aussi déterministe que dire "allez au supermarché et dites-moi combien de feux vous avez passés"
idpour trouver la première ligne. Le second doit trier le résultat complet dans lavalcolonne (non indexée) .