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

Mysql CACHE dotazu – MySQL – Fórum – Programujte.comMysql CACHE dotazu – MySQL – Fórum – Programujte.com

 

Pavelv0
Stálý člen
18. 8. 2014   #1
-
0
-

Zdravím, v tabulce naměřených hodnot s cca 260tisíc řádky potřebuji udělat sumu jednoho sloupce. Dotaz mi trvá cca 0,3 vteřiny, což je pro mě dlouhý čas, v případě interpretace několika sum na web. Napadaj mi dvě řešení:

1. Sloupec hodnot, který je řešen inkrementálně převést na sumu. Celková suma dosahuje velikosti 0-1000 s přesností na desetiny. Pak bych snadno udělal sumu jako rozdíl dvou dat. Musel bych ale přepočítat všechny již uložené řádky.

2. Vytvořit cachovací tabulku, do které bych vždy sumu vložil i s časem posledního záznamu. Při dalším dotazu bych sumu vyčetl a spočítal sumu několika desítek nově vytvořených řádků. Toto by bylo určitě jednodušší řešení na implementaci.

Jaké řešení by jste mi doporučily?

Nahlásit jako SPAM
IP: 109.235.7.–
Flowy0
Věrný člen
19. 8. 2014   #2
-
0
-

mas na tom stlpci index?

Nahlásit jako SPAM
IP: 91.148.1.–
https://github.com/Flowy
KIIV
~ Moderátor
+43
God of flame
19. 8. 2014   #3
-
0
-

#2 Flowy
spis bych pochyboval o tom, ze by se index pro sumu pouzil.. mozna tak pokud by delal vyber casti radku podle toho scitaneho sloupce.

Jinak treti moznost je mit trigger, ktery by updatoval nejakou konkretni hodnotu v "cache" tabulce

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
19. 8. 2014   #4
-
0
-

#1 Pavelv
Nejsem sice žena, ale doporučím ti trigger.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
19. 8. 2014   #5
-
0
-

Nebylo by jednodusi pri ukladani do tabulky pocitat zrovna i tu sumu v jine tabulce dalsim dotazem?
Nejak takto: INSERT INTO tabulka sloupec45 VALUES sloupec45+123

Nahlásit jako SPAM
IP: 2001:718:2601:258:280c:52...–
Kit+15
Guru
19. 8. 2014   #6
-
0
-

#5 peter
Však proto jsme mu navrhli ten trigger. Ty bys to chtěl řešit oklikou přes aplikaci? To by bylo poněkud nepraktické a pomalé.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
19. 8. 2014   #7
-
0
-

#2 Flowy
Index samozřejmě mám, ale nepociťuji žádné zrychlení.

#3 KIIV
Díky, také jako nejlepší se mi jeví použít trigger při ukládání dat.

Nahlásit jako SPAM
IP: 109.235.7.–
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #8
-
0
-

Zkus pouzit select high priority ..., teoreticky by to mohlo neco ubrat. Posli jeste select, urco se to da vytunit hintama.

Nahlásit jako SPAM
IP: 195.212.29.–
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #9
-
0
-

A jeste posli exekucni plan pro tvuj selekt, mrknu jak jsi na tom s rychlosti celkoveho selektu, jestli tam nemas nejake krpy.

Nahlásit jako SPAM
IP: 195.212.29.–
Pavelv0
Stálý člen
19. 8. 2014   #10
-
0
-

#8 Mixxy
select vypadá takto: 

SELECT SUM(data23) FROM mereni WHERE YEAR(cas) = YEAR(CURDATE())

high priority mi nic neurychlí

Nahlásit jako SPAM
IP: 109.235.7.–
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #11
-
0
-

A posli jeste vysledek tohoto dotazu:

explain SELECT SUM(data23) FROM mereni WHERE YEAR(cas) = YEAR(CURDATE());
 

Nahlásit jako SPAM
IP: 195.212.29.–
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #12
-
0
-

A strukturu tabulky :-)

Nahlásit jako SPAM
IP: 195.212.29.–
Pavelv0
Stálý člen
19. 8. 2014   #13
-
0
-

Předpokládam, že nezáleží na struktuře nezúčastněných sloupců. Formát sloupce cas je datetime s primárním klíčem, sloupec data23 je typu float(5,1) s klíčem MUL.

explain mi dá select_type = SIMPLE, table = mereni, type = index, possible_keys = null, key = idx_mereni_data23, key_len = 5, ref = null, rows = 302395, Extra = Using where, Using index

Nahlásit jako SPAM
IP: 109.235.7.–
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #14
-
0
-

Ok, diky za informace, zkusim si to nasimulovat a zkusim ti vymyslet neco, co by ti ten dotaz zrychlilo.

Nahlásit jako SPAM
IP: 195.212.29.–
KIIV
~ Moderátor
+43
God of flame
19. 8. 2014   #15
-
0
-

timdle: 
YEAR(cas)
se zbavis moznosti pouzit index nad tim sloupcem... v posgresql by slo udelat index pres  YEAR(cas), ale mysql to asi nebude umet

takze minimalne doporucuju prekopat aspon na interval od zacatku roku do konce roku - aby se aspon ten index pouzit mohl  (pokud tam mas ted jen letosni data, tak se to moc neprojevi ale pockej za par let az tam budou desitky milionu zaznamu)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
19. 8. 2014   #16
-
0
-

#8 Mixxy
Jenom blázni dávají high priority na pomalé dotazy.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Mixxy
~ Anonymní uživatel
179 příspěvků
19. 8. 2014   #17
-
0
-

To Kit: Na druhou stranu nevis nic o architekture a vytizenosti te databazi. Pokud by Jefry sbiral tuny dat a sqlko by mel pomaly jen kvuli vytizenosti databaze, mozna by mu to trochu pomohlo a to bylo v mem ocekavani...

Nahlásit jako SPAM
IP: 195.212.29.–
Kit+15
Guru
19. 8. 2014   #18
-
0
-

#17 Mixxy
High priority na select znamená dát low priority na vše ostatní. Tím odstavíš všechny inserty a updaty. Procesy, které na ně čekají, uvězníš v paměti nebo ve swapu.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
19. 8. 2014   #19
-
0
-

#15 KIIV
Takže jestli to chápu správně, abych mohl uplatnit index, nesmím daný sloupec prohánět funkcí? Jak tedy získam časové razítko začátku roku?

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
19. 8. 2014   #20
-
0
-

#19 Pavelv
neni problem pouzit neco jako:  

cas >= MAKEDATE(YEAR(NOW()),1)

hlavne se da pouzit ten index

Kazdopadne v predchozi praci sem treba zjistoval, proc rotace tabulek v mysql byly tak priserne pomaly.. sice byl index na tabulce, kde se pouzival unixtime, ale blbec predchozi kolega vyblil neco takovyho  select * from table where from_unixtime(ts) >= 20100101000000 ...

to mozna bezi kdyz je tam par zaznamu, ale nad desitkama milionu se to uz zatracene protahne, prepocitavat pro kazdy radek ts na datetime a pak to teprve porovnat s konstantou

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
19. 8. 2014   #21
-
0
-

Ok, je třeba nad tim přemýšlet, a ne jen tupě psát. Vymyslel jsem takovýto kus kódu. Moc se mi nelíbí ten select dělat třikrát nad stejnýma daty. Nešlo by to nějak upravit? 

create trigger tr_update_cache
after insert on mereni
for each row
begin
	UPDATE cache c  
		JOIN (SELECT sum(data23) as suma_year
			FROM mereni WHERE cas >  CONCAT(YEAR(CURDATE()),'-01-01 0:0:0')) d
		SET c.value = Coalesce(d.suma_year,0)
		WHERE name = 'data23_year';

		UPDATE cache c  
		JOIN (SELECT sum(data23) as suma_month
			FROM mereni WHERE cas >  CONCAT(YEAR(CURDATE()),'-',MONTH(CURDATE()),'-01 0:0:0'))d
		SET c.value = Coalesce(d.suma_month,0)
		WHERE name = 'data23_month';

		UPDATE cache c  
		JOIN (SELECT sum(data23) as suma_day
			FROM mereni WHERE cas >  Date_add(now(), INTERVAL -1 DAY))d
		SET c.value = Coalesce(d.suma_day,0)
		WHERE name = 'data23_day';
end

Nakonec i na ten začátek roku jsem vymyslel funkci, tak nevím co by bylo lepší

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
20. 8. 2014   #22
-
0
-

uf, ted si z kazdyho insertu vyrobil jeste 3x podobnej dotaz jako pred tim... tim si pasoval trigger na "nic se tu nedeje a server je furt pretizenej na 2 roky dopredu"

ten princip by byl JEN pricist pridanou hodnotu do tabulky cache na spravne misto, ne to prepocitavat porad dokola

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
20. 8. 2014   #23
-
0
-

#22 KIIV
Ano, ale uvědomil jsem si, že potřebuji v té tabulce hodnotu za poslední rok, měsíc, den. proto to přepočítávání

Nahlásit jako SPAM
IP: 109.235.7.–
peter
~ Anonymní uživatel
4016 příspěvků
20. 8. 2014   #24
-
0
-

Jestli by treba nebylo jednodussi podivat se, jak to pocitaji ruzne statistiky pristupu. U nas pouzivaji Aw stat nebo Zabbix. Zabbix umi sledovat i teplotu a umi delat grafy pro ruzna casova obdobi. Vetsinou vyuzivame pro teplotu v severovni a zda konkretni pc a zarizeni pingaji.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:55c7:b0...–
KIIV
~ Moderátor
+43
God of flame
20. 8. 2014   #25
-
0
-

#23 Pavelv
na to ti ale staci jen suma po dnech - kdyz das do triggeru neco jako:

insert into cache (datum, suma) values (date(now()), sum23) on duplicate key set suma=suma+sum23;

tak se jen pripocte k predchozi sume - nepotrebujes prepocitavat co tam je, kdyz uz to spocitany mas N-krat

a secist tech 365 dennich hodnot za rok se vcelku da prezit

(je samozreme nutnost mit unikatni klic nad datumem)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 13 hostů

 

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