Optimalizace dotazu – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Optimalizace dotazu – MySQL – Fórum – Programujte.comOptimalizace dotazu – MySQL – Fórum – Programujte.com

 

Pavelv0
Stálý člen
30. 7. 2014   #1
-
0
-

Zdravím, vykonávám takovýto dotaz, kde se přehrabuju v neskutečném množství dat. Za den sbírám cca 1400 záznamů a aplikace běží již přes rok... Pokud zavolám dotaz  

  (SELECT  SUM(rain) FROM mereni WHERE cas > CURDATE()) 
UNION ALL 
(SELECT  
	SUM(rain) FROM mereni WHERE MONTH(cas) = MONTH(CURDATE()) 
	AND YEAR(cas) = YEAR(CURDATE())) 
UNION ALL 
(SELECT  SUM(rain) FROM mereni WHERE YEAR(cas) = YEAR(CURDATE()) )
UNION ALL
(SELECT MAX(temp) FROM mereni WHERE date(cas) = date(now()))

tak jeho vykonání trvá cca 0,8 vteřiny. Dal by se nějak zrychlit?

Nahlásit jako SPAM
IP: 109.235.7.–
peter
~ Anonymní uživatel
3981 příspěvků
30. 7. 2014   #2
-
0
-

EXPLAIN  a zjisti si, co ti trva nejdele.
Ja bych si udelal tabulku s prubeznymi vypocty po urcitych intervalech. Neco jako:
type = year
date = 2013
rain = 12345
Totez pro mesice. Pak bych dotaz postavil tak, ze vyber z pomocne tabulky plus UNION cas>akt_mesic AND cas>aktualni z celkove tabulky. Protoze vsechny predchozi mesice mam uz vypocitane v pomocne tabulce. tez zalezi na tom, jake mas indexy.
Mozna by pomohl index sloupec, ktery bude obsahovat mesic a dalsi s rokem. Prepocitavat rok z casoveho razitka muze byt slozitejsi.
Tez by pomohlo zmenit poradi podminek, protoze rok vic unikatnejsi nez mesic.
MONTH(cas) = MONTH(CURDATE()) AND YEAR(cas) = YEAR(CURDATE()))
Pripadne celou tu podminku prepsat na cas>x and cas<y.

Si myslim, ze ho ale vic zatezuje prave to prepocitavani nez vyhledani prislusnych radku. Bys mohl export db (strutura+data) treba zabalit rarem a nekde vystavit, aby se to dalo testovat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:d4ee:5c...–
P
~ Anonymní uživatel
212 příspěvků
30. 7. 2014   #3
-
0
-

Vysledek druheho selectu je podmnozinou vysledku tretiho selectu, takze je tam ten druhy select nejspis nejen zbytecny ale i skodlivy, protoze data z aktualniho mesice tam budou 2x.

Kdyz druhy select vynecham, slo by to prepsat takto:

SELECT SUM(rain) FROM mereni WHERE cas > CURDATE() OR YEAR(cas) = YEAR(CURDATE()

UNION ALL 

SELECT MAX(temp) FROM mereni WHERE date(cas) = date(now())

Nevim jaky smysl ma michat dohromady bez dalsiho rozliseni hodnoty deste a teploty, a jak lze merit hodnoty deste v budoucnu, ale to je nad ramec dotazu.

Nahlásit jako SPAM
IP: 85.93.116.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Optimalizace — založil Kowalsky95

Optimalizace — založil Figa

Optimalizace pro IE — založil Gadael

Optimalizace webu — založil Telka

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý