Portál AbcLinuxu, 10. května 2025 17:18

Dotaz: Vyhledani radku s max hodnotou podle kriteria

25.6.2008 10:40 David Sedláček | skóre: 20 | Žďár nad Sázavou
Vyhledani radku s max hodnotou podle kriteria
Přečteno: 271×
Odpovědět | Admin
Zdravim, mam takovy "maly" problemek o par tisic radcich. Databaze je MySQL.

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.

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.6.2008 10:57 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Vyhledani radku s max hodnotou podle kriteria
Odpovědět | | Sbalit | Link | Blokovat | Admin
GROUP BY is your friend.
If you hold a Unix shell up to your ear, you can you hear the C.
25.6.2008 12:06 David Sedláček | skóre: 20 | Žďár nad Sázavou
Rozbalit Rozbalit vše Re: Vyhledani radku s max hodnotou podle kriteria
Mohl bys vysvetlit, jak by se dal ten dotaz s GROUP BY optimalizovat? Na nic efektivnejsiho jsem zatim neprisel..
25.6.2008 12:07 David Sedláček | skóre: 20 | Žďár nad Sázavou
Rozbalit Rozbalit vše Re: Vyhledani radku s max hodnotou podle kriteria
Indexovanim casu "vytvoreno" se mi doba vykonavani zkratila na polovinu. Ale stale to neni, co bych chtel :) .
25.6.2008 14:44 Tomas
Rozbalit Rozbalit vše Re: Vyhledani radku s max hodnotou podle kriteria

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.

25.6.2008 18:58 David Sedláček | skóre: 20 | Žďár nad Sázavou
Rozbalit Rozbalit vše Re: Vyhledani radku s max hodnotou podle kriteria
Chtel jsem napsat, ze to nakonec obejdu vlozenim hodnoty do zvlastni tabulky. Ale po druhem precteni vaseho prispevku jsem zjistil, ze prave tohle jste mi navrhnul :-) .

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)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.