Hallo Linuchs,
deine Query ist ohnehin total verquast und dürfte etliche "undefined" Komponenten enthalten.
- Du mischst eine Aggregatspalte mit einer Nichtaggregatspalte
- Du referenzierst im Subselect die Spalte adr1.id - auf welche ID soll sich das denn bitte schön beziehen, wenn Du im SELECT eine MAX-Bestimmung machst? Oder steckt im FROM eine Abfrage
adr1.id = $someId
, so dass die adr1.id für alle Sätze gleich ist?
Meine Empfehlung wäre, zwei Querys zu machen.
Zunächst diese:
SELECT trm1.zeit_neu, trm1.id, adr1.id
FROM table1 trm1 JOIN table2 adr1 ON ...
WHERE ...
ORDER BY trm1.zeit_neu desc
LIMIT 1
Ich hab da jetzt irgendeinen JOIN hingeschrieben, das ist nur symbolisch und sieht in deiner Realität sicherlich anders aus.
Damit bekommst Du den MAX-Wert für zeit_neu und die trm1.id dazu, auf definierte Weise und ohne Stringverkettung. Wenn Du einen Index auf zeit_neu hast, führt diese Aufteilung auch zu einer Beschleunigung, weil er dann den Index dafür nutzen kann. Ob Du die adr1.id auch selektieren musst, hängt von Kontext ab den ich nicht kenne - ich hab sie mal reingeschrieben für den Fall, dass es mehrere adr1.id geben könnte.
Im zweiten Schritt machst Du dann den Zufalls-Select.
Das sind zwar zwei Queries, aber man muss nicht alles in einer Query zusammenpressen. Wenn dein SQL Server auf localhost läuft, ist die Abfragelatenz miminal. Wenn er auf einem anderen Server läuft, hast Du ein paar Millisekunden Latenz drin, aber bei einem stark belasteten System wird diese Latenz für die Ausführung anderer Requests genutzt, d.h. der Serverdurchsatz verringert sich nicht. Nur die Antwortzeit für einen einzelnen User, um ein kleines Bisschen. Das ist nicht schlimm. Aus Serversicht geht es Dir um die Optimierung des Durchsatzes, nicht unbedingt um schnellste Antwortzeit für einzelne User.
Rolf
sumpsi - posui - obstruxi