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 INSERT
opé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 NUMBER
syntaxe est assez sujette aux erreurs.
SELECT *
combiné avec un index de colonne dans ORDER BY
est 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"
id
pour trouver la première ligne. Le second doit trier le résultat complet dans laval
colonne (non indexée) .