Hoe kan ik het beter doen ?

Status
Niet open voor verdere reacties.

nolversteeg

Gebruiker
Lid geworden
5 sep 2011
Berichten
10
Geacht forum,
Ik ben al redelijk lang aan het stoeien met Mysql, wat ik wil werkt, alleen ik heb het vermoeden dat dit beter of anders kan wat betreft snelheid.

Er draait een systeem wat waarden iedere minuut in de Mysql database zet , alleen de notatie is op zijn Amerikaans.
Nu laat ik Mysql iedere minuut een event uitvoeren die de data in 4 nieuwe tabellen zet met de juiste waarden.

[SQL]insert into station (RecDateTime, Channelindex,tempout,hitempout,lowtempout,humout,dewpoint,lowwindchill,Humidex,heatindex,date,time,Datum)
SELECT `RecDateTime` , `Channelindex`,
CASE WHEN `issdata`.TempOut = 32767 THEN NULL ELSE (((`issdata`.TempOut /10) -32) /1.8) END,
CASE WHEN issdata.HiTempOut = -32768 THEN NULL ELSE (((`issdata`.HiTempOut /10) -32) /1.8) END,
CASE when issdata.LowTempOut = 32767 THEN NULL ELSE(((`issdata`.LowTempOut /10) -32) /1.8) END,
CASE WHEN issdata.humout = 255 THEN NULL ELSE `issdata`.humout END,

CASE WHEN issdata.DewPoint = 32767 THEN NULL ELSE (((`issdata`.DewPoint /10) -32) /1.8) END,
CASE When issdata.LowWindChill = 32767 Then NULL ELSE (((`issdata`.LowWindChill /10) -32) /1.8) END,
((((`issdata`.`TempOut` /10) -32) /1.8) + 5/9 * ((6.112 * exp (17.62 * (((`issdata`.`TempOut` /10) -32) /1.8) / (243.12 + (((`issdata`.`TempOut` /10) -32) /1.8)))*( `issdata`.`humout`)/100) - 10)),
CASE When issdata.Heatindex = 32767 THEN NULL ELSE(((`issdata`.Heatindex /10) -32) /1.8) END ,
cast(`issdata`.`RecDateTime` as date),
cast(`issdata`.`RecDateTime` as time),
Date_format(`issdata`.`RecDateTime`, '%d/%m/%Y') AS Datum
FROM `issdata`
WHERE `ChannelIndex`=0 and `issdata`.`RecDateTime` NOT IN (select RecDateTime From station )
ORDER BY `recdatetime` DESC;
[/SQL]

Bovenstaand is zoals ik dit nu doe om een nieuwe tabel te maken,en zo zijn er nog 4 te gaan.

het is de database van mijn weerstation (envoy8x).

Vraag: Kan dit op een betere manier zodat ik snelheid krijg in het uitvoeren van dit event. Omdat ik in PHP ook nog heel veel moet doen om deze data op de website te krijgen.

Misschien kort door de bocht , een schop in een andere richting zou welkom zijn, ik ben geen programmeur, maar bijt me wel vast om het in goede orde te krijgen.
Bij voorbaat dank .

Resultaat van mijn programmeer kunsten zijn te zien op www.meteoeersel.nl

Nol Versteeg



.
 
Laatst bewerkt door een moderator:
Hoe ziet je tabel-structuur er uit qua datatypes?

Welke data biedt het weerstation je aan?
Als het bijvoorbeeld een datum inclusief tijd is (bijv: 2012-10-05 10:39:05), sla die dan in de database op als een TIMESTAMP of DATETIME.

Op die manier kun je al deze MySQL functies gebruiken, waaronder deze: DATE_FORMAT()
 
Laatst bewerkt:
Hallo,

Bijde tapellen heben de datetime funktie, alleen de laatste tabel heeft daar 3 kolommen bij met losse date (date) ,Time (time) en Datum (Char), de laatste datum is op de tabel ingevoerd omdat de input van het weerstation (externe partner) de nederlandse notatie wil zien.

Het filteren van de grote getallen 32767 en 255 is nodig omdat bij geen data van het station deze tevoorschijn komen als een fout waarde ipv NULL.
Groeten, Nol Versteeg
 
Hoe ziet de tabel er uit waar de oorspronkelijk data in komt?
 
hoe kan ik het beter doen

Hallo Tha,
ik hoop dat je deze bedoeld,
issdatatabel.JPG
Station1tabel.JPG

1e tabel is de tabel die gegenereerd wordt door het weerstation, de 2e tabel is 1 van de 4 waar de nieuwe data in komt.

Groeten Nol
 
hoe kan ik het beter doen

Hallo Tha,
dit nog even extra de data zoals die dus getransformeerd wordt

stationdata resultaat.JPG
 
Ah, dat is inderdaad wat ik bedoel :thumb:

Kun je nog een schermafdruk maken van de resultaten uit de tabel issdatatabel?
Dan kan ik aan de hand daarvan een voorbeeldje voor je uitwerken :)
 
issdataresultaat.JPG

de hele regel is langer maar het gaat voor deze tabel over te temp en de hum
 
Ik heb alleen de eerste 3 regels gepakt :)

http://sqlfiddle.com/#!2/ceeb3/7

Nu heb ik met 1 query op de oorspronkelijke issdatatabel de datum in het juiste formaat gekregen zonder dat ik ze in een nieuwe tabel hoef te zetten
 
Laatst bewerkt:
Is inderdaad een andere denk wijze, ik moet alleen heel voorzichtig zijn , want de issdatatabel is heilig , en moet daar altijd op terug kunnen vallen de volledige issdata tabel wordt iedere minuut aangevuld door een query die in de logger (envoy8x) draaid en hier kan ik niets aan wijzigen. maar ik ga dit voorbeeld als denkvoorbeeld nemen om mijn oude denkwijze even te verstoren.

Groetjes Nol
 
Zolang je alleen SELECT-queries gebruikt zal er niks aangepast worden op die tabel :)
 
hoe kan ik dit beter doen

Code:
SELECT Tempout,
DATE_FORMAT(RecDateTime,'%d/%m/%Y') AS datum,
DATE_FORMAT(RecDateTime,'%H:%i') AS tijd
from station 
where  Month(RecDateTime) = month(now()) 
Order by HumOut DESC 
limit 1

Dit werkt heel goed,
alleen denk ik dat ik nu het snelheids probleem bij de PHP query ga leggen, deze moet dit dan 60 keer per minuut gaan uitvoeren en in het mysql scedule event maar 5 keer per minuut.

groetjes Nol
 
Waarom zou je dit elke seconde uit willen voeren?

Je wilt de data op een pagina tonen nietwaar?
Dus zal je deze query alleen uitvoeren wanneer de pagina opgeroepen wordt lijkt mij.
 
hoe kan ik het beter doen

Verkeerd over gekomen denk ik.

Wat ik wil is iedere minuut de data die van de logger afkomt (issdata) vertalen naar 5 aparte stations gemerkt door channelindex 0....4 en de nederlandse notatie .Zodat ik 5 tabellen heb waar ik de data vandaan kan halen.
dat is de taskchecular die ik uitvoer .
De PHP querie die ik daarna uitvoer om de data geschikt te maken voor mijn site (60 waarden) haal ik uit station0...4. die met een DOS(VBS script) iedere minuut uitgevoerd wordt en weggeschreven op HDD als een php bestand.(echo '$outsideTemp = ','"',$arr1['TempOut'],'"',';',"\n";)
Deze data kan ik gebruiken voor mijn site. zodat ik niet steeds als de site aangeroepen wordt het hele script moet doordraaien .
even tot nu want er moet nog veel meer gebeuren binnen die minuut.

als ik de php query laat draaien wanneer de site opgeroepen wordt duurt het minstens 15sec voordat er iets op het scherm komt.

Maak er geen halsbreken van.
Ik ga nu iets zeggen. "ik denk dat er in nederland 2 personen zijn die met de Davis envoy8X datalogger werken en al zo ver zijn dat het een beetje werkt."
 
Oke, dus het is een performance issue.

Waarom laat je geen cronjob lopen die elke minuut voor jou een statische pagina maakt op basis van 1 query?
Wanneer men de pagina opvraagt haal je de statische pagina op van een minuut (of meer) eerder zodat men direct resultaat heeft en er op de achtergrond een nieuw bestand aangemaakt wordt.

Het is alleen de vraag hoe actueel je de gegevens van de logger op je website wilt, is dat realtime of mag daar enige vertraging in zitten?
 
Hoe kan ik dat beter doen ?

Hallo Tha,

Het heeft even geduurd, eerst test en dan antwoordt, wat ik gedaan heb : in de windows taakplanner heb ik de 2 taken die eerst in de mysql scheduler uitgevoerd werden veranderd , zodat windows nu de zaak onder controle houdt en de taken afzonderlijk afhandeld , nu heb ik geen uitval meer van data . ik moest het event eerst wel door Mysql laten doen, omdat ik in de windows taakplanner niet sneller kon dan 5 minuten.

bedankt dat je me op een ander spoor gezet hebt .
Het topic kan gesloten worden.

groeten Nol Versteeg
 
Mooi dat je toch een verbetering hebt gevonden :)

Een topic sluiten we hier niet (tenzij hij in strijd is met onze huisregels ;)).
Wanneer je van mening bent dat je vraag opgelost is kun je dit aangeven door onderaan het eerste bericht op "Zet status opgelost" te klikken. :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan