On Mon, 16 Sep 2013 14:01:31 +0200 Jakob Hirsch <j...@plonk.de> wrote: > Sven peitz, 2013-09-14 11:07: > > $result1=mysql_query("SELECT value FROM data WHERE id = (select max(id) > > FROM data WHERE channel_id LIKE '14')"); > ... > > Diese Anfrage dauert ca. 6-7 Sekunden. Hat jemand eine Idee wie man > > dieses beschleunigen kann? > > Der subquery macht einen table-scan über die komplette data-Tabelle, was > dauert natürlich entsprechend lange.
achso, es gibt keinen index auf `id`... den scan macht dann aber die haupt-query, nich die subquery. > So ist es kein Problem (wenn auch nicht schön): > SELECT value FROM data WHERE channel_id=14 AND timestamp=(select > max(timestamp) FROM data WHERE channel_id=14); wie schon gesagt, man wuerde doch eleganter schreiben: select value from data where channel_id=14 order by timestamp desc limit 1; > Allerdings sollte man nicht ohne Grund direkt auf der DB arbeiten. Das > Vorgehen wie von Andreas Götz ist auch deutlich einfacher (Abfrage mit > from=now). from=now... funktioniert doch aber wie gehabt nur bei erfassung absoluter staende. ansonsten war die methode doch "from=<x> seconds ago"...? also so, dass im im angegebenen zeitraum (mit now = nur aktuelle sekunde) genug werte erfasst sind, damit der interpreter in der middleware daraus etwas berechnen kann. also bei s0-zaehlern mindestens zwei impulse, etc... oder wurde da middleware-seitig was geandert? - Thorben