Betrachten Sie eine Tabelle mit Werten und Hashes wie folgt:
+------------+----------+------+-----+---------+----------------+
| 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 | |
+------------+----------+------+-----+---------+----------------+
Die folgende Abfrage wird in 0,00 Sekunden beendet:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Diese Abfrage dauert jedoch 3 Minuten und 17 Sekunden:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Ich sehe, dass die Prozessliste den Status anzeigt, während die Abfrage ausgeführt wird Sorting result
. Die Situation ist vollständig reproduzierbar. Beachten Sie, dass ein anderer Prozess INSERT
kontinuierlich Vorgänge in der Tabelle ausführt .
Warum würde die Ausführung der spezifischeren Abfrage länger dauern als die *
Abfrage? Ich war immer der Meinung, dass *
Abfragen aus Performancegründen vermieden werden sollten.
ORDER BY NUMBER
Syntax ist sehr fehleranfällig.
SELECT *
Kombination mit einem Spaltenindex in ORDER BY
verschleiert, welche Spalte sortiert wird - ein weiterer Grund, *
s ...
*
ist nicht explizit. Das Sprichwort "Gib mir alle Spalten und sortiere nach der dritten" ist ungefähr so deterministisch wie das Sprichwort "Geh in den Supermarkt und sag mir, wie viele Ampeln du passiert hast"
id
, um die erste Zeile zu finden. Der zweite muss das komplette Ergebnis in der (nicht indizierten)val
Spalte sortieren .