Rolf B: Abfrage über zwei Tabellen, sort, LIMIT 10, Abfrage dauert 45 Sekunden

Beitrag lesen

Hallo dedlfix,

die Frage ist, was der Aufwandstreiber ist. Ist es der Join über die PLZ, oder der ORDER BY der Ergebnismenge. Findet ein Filesort statt, oder ein indexed read?

Je nach dem, wie dumm MYSQL vorgeht, erzeugt er zuerst den Join über alle Sätze, sortiert dann und führt den LIMIT durch. Was hier helfen kann, ist das Vorziehen des LIMIT. Ich habe allerdings gerade kein MYSQL laufen und bin nicht sicher ob ein innerer LIMIT zulässig ist...

SELECT ab.*, b.gemeinde
FROM (SELECT * FROM abrufe ORDER BY a.datum DESC LIMIT 10) ab,
     plz b
WHERE ab.plz = b.plz

Alternativ kann auch die Dedlfixsche Standardtransformation von Joins in Subselects helfen:

SELECT a.*, (SELECT gemeinde FROM plz b WHERE b.plz=a.plz)
FROM abrufe 
ORDER BY a.datum DESC LIMIT 10

Welcher von beiden besser ist, muss ein Explain ergeben. Ein Index auf die PLZ-Spalte in der PLZ Tabelle und auf die DATUM-Spalte der Abrufe-Tabelle dürfte aber auf jeden Fall hilfreich sein.

Rolf

--
sumpsi - posui - clusi