Portál AbcLinuxu, 10. května 2025 17:18
Moje tabulka je:
ip [15 vch index] ping [float] vytvoreni [timestamp]
A v tabulce je nejaky pocet skupin hodnot ip. Skupina -> vzdy nekolik stejnych hodnot s rozdilnymi casy.
V kazde teto skupine je pak nejvetsi a nejmensi cas "vytvoreni hodnoty".
   Potrebuji vybrat hodnoty ip+ping z kazde skupiny a k ni nejvetsi cas vytvoreni (posledni hodnota).
   Nejsem v SQL nejak zbehly, muj dotaz:
SELECT s2.ip, s1.ping
FROM ping
AS s1
LEFT JOIN (SELECT MAX(vytvoreno) AS max,ip FROM ping GROUP BY ip)
AS s2
ON s1.vytvoreno=s2.max
WHERE s1.ip=s2.ip
je prilis pomaly, az 0.70 sekundy.
Obávám se že nic lepšího v SQL v MySQL nevykouzlíte. Leda že by jste rozšířil SQL o OLAP window funkci RANK. .
Pokud potřebujete dotaz zrychlit tak bych šel cestou trigerů (nebo vylepšení ORM) a při zápisu do ping bych upsertoval zázanm do nové tabulky, kde primárním klíčem ( a indexem ) by byla ip. Žádaný výsledek je pak přímo tato tabulka.
Ale jedna vec me celkem dost prekvapila, ohledne zminovaneho triggeru. Kdysi, kdyz jsem ho potreboval a v PostgreSQL triggery byly, v MySQL nikoliv. Ale koukam, ze v 5.0 jsou, wow!(tm)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.