SQL-Abfrage dauert lange, wenn viele Zeilen - mysql, Leistung

Verwenden der Abfrage:

SELECT st.*
FROM surf_times st
WHERE st.Time =
(SELECT MIN(t.Time)
FROM surf_times t
WHERE t.SteamID = st.SteamID AND t.Map = st.Map)
AND st.Map = "surf_milkyway"
ORDER BY st.Time
LIMIT 15

Nimmt 0.15 ~ Sekunden mit 7 Ergebnissen:

Showing rows 0 - 6 (7 total, Query took 0.1650 sec) [Time: 61.76 - 70.05]

Wenn diese Abfrage für eine Tabelle ausgeführt wird, die 15 Ergebnisse zurückgibt, dauert es plötzlich 23 Sekunden

Showing rows 0 - 14 (15 total, Query took 23.0710 sec) [Time: 47 - 52.13]

"surf_milkyway" hat 17 Zeilen insgesamt und benötigt 0.16 ~ Sekunden zur Ausführung.

"surf_beginner" hat 2496 Gesamtzeilen und benötigt 23 Sekunden zur Ausführung.

Es dauert 20+ Sekunden, wenn die gesuchte Karte viele Ergebnisse in der Tabelle hat und lange braucht, um sie zu vergleichen und zu sortieren. Ist das etwas falsch mit der Abfrage oder der Art, wie die Tabelle indexiert wird usw.?

Tabelle ist wie folgt strukturiert:

SteamID - bigint(20)
Name - varchar(255)
Map - varchar(255)
Time - float
Date int(20)
id - int(11) - AUTO_INCREMENT, Primary

Antworten:

1 für die Antwort № 1

Eine unkorrelierte Abfrage wird immer besser abschneiden als eine korrelierte, aber wenn die Leistung noch immer schlecht ist, müssten wir wirklich die CREATE-Anweisungen der Tabelle und das Ergebnis der EXPLAIN-Anweisung sehen ...

SELECT a.*
FROM surf_times a
Join
(SELECT steamid,map, MIN(Time) min_time
FROM surf_times
Group by steamid,map) b
On b.steamid = a.steamid
And b.map = a.map
And b.min_time = a.time
Where a.Map = "surf_milkyway"
ORDER BY a.Time
LIMIT 15

0 für die Antwort № 2

Durch das Hinzufügen der folgenden Indizes wird die Leistung verbessert:

INDEX(Steamid, Map, Time),
INDEX(Map, Time)