MySQL Daten zum Zeichnen einer Linie

Status
Für weitere Antworten geschlossen.

BTCStorage

Ensign
Registriert
Mai 2020
Beiträge
166
Ich habe in einer MySQL Tabelle jeweils den Kontostand und ein timestemp abgespeichert, damit kann ich nun eine Linie in ein Diagram zeichnen, funktioniert soweit auch alles so wie es soll. Alle 15 Sekunden wird ein neuer Eintrag gespeichert mit dem derzeitigen Kontostand und timestemp.

Jetzt stehe ich vor folgenden Problemchen, nach ein bis zwei Tagen habe ich einige hundert oder tausend Datensaetze gesammelt und diese alle ins Diagram zu zeichnen sieht bloed aus und kostet wahrscheinlich auch den Webbrowser zu viel Resourcen.

Wie kann man das jetzt machen die ganzen Daten aufteilen sodass man eine Linie zeichnen kann welche vom Anfang vom ersten Datensatz bis zum Ende geht. Also ich kann nachvollziehen das man da natuerlich die ganzen Daten irgendwie aufteilen muss, vielleicht das erste Anfangsddatum nimmt und dann erst nach einer Halben Stunde oder Stunde das naechste Ergebniss und dann daraus eine Linie bekommt die von allen Daten bisjen was hat.

Aber wie macht man das professionel, legt man eine zweite Tabelle an in welche man mit einem Script diese Bearbeiteten Daten dann alle paar Minuten abspeichert damit die Webseite dann diese Linie auslesen kann.

Oder laest man die Webseite aus der Original Tabelle auslesen usw. ich bin da bisjen am nachdenlen was eine gute Loesung waere, wenn jemand Ideen hat dann gerne her damit.
 
Hi,

sorry, aber das ist so wirr und unvollständig geschrieben, ich habe keine Ahnung was genau du möchtest. Bitte erkläre mal mit Beispielcode und Screenshots!

VG,
Mad
 
  • Gefällt mir
Reaktionen: Mickey Mouse und Kenny [CH]
Eine möglichkeit, wenn der stand öfters konstant ist, wäre z.b die gleichen values zu ignorieren und nur die änderungen zu plotten/speichern/verwenden.
Anderenfalls auf einen tag/tage begrenzen oder aber auch die 15sek zu 1min erhöhen kann helfen je nach anforderung.
 
Das kommt drauf an (tm) :daumen:

Was möchtest Du erreichen - eine punktgenaue Abbildung, oder einen Verlauf, für spätere Prognosen oder sowas?

Für ersteres kann man sein DB-Schema erweitern um Start_Time; End_Time (wenn nicht schon vorhanden). Dann aus jedem INSERT ein UPSERT machen mit der Einfügebedingung "einzufügender Kontostand ungleich bisheriger Kontostand" und, wenn neue Daten kommen, entweder den End_Time Wert auf den aktuellen Zeitpunkt setzen (wenn es keine Änderung gab) oder halt neu einfügen mit Start_Time = End_Time = aktueller Zeitpunkt.

Wenn man das nicht möchte: GROUP BY verwenden.

Für zweiteres müßtest Du dich mit OLAP auseinandersetzen. Damit geht sehr viel. Man braucht aber auch ein passables Verständnis von Statistik dafür.
 
Oder alternativ eine Zeitreihendatenbank wie InfluxDB verwenden die genau für sowas gedacht ist. Da kannst du dann in der Query auch direkt aggregieren lassen.
 
  • Gefällt mir
Reaktionen: DarkAngel2401
Also ich denke ich muss am besten eine zweite MySQL Tabelle erstellen und in diese dann alle paar Minuten aus der original Tabelle die Daten so reinschreiben das alles zusammen gefast ist. z.b. wenn in der original Tabelle ueber 10 Tausend Daten sind von jeweils allen 15 Sekunden abstaenden dann fange ich an beim ersten Datensatz und lasse eine for schleife durchlaufen wenn ein naechster datensatz ne halbe Stunde spaeter alt ist dann nehme ich den als zweiten datensatz usw dann habe ich am Ende viel weniger Daten die ich dann in die neue Tabelle schreibe, also alles bisjen zusammen gefast und die Webseite kann dann aus dieser Tabelle die Linie lesen.

Das scheint mir die einfachste Loesung zu sein, ich frage mich halt wie das andere so machen.

So wie das jetzt ist sind es einfach zu viel Daten, stell dir vor wenn du zehntausend Daten jedesmal ins Diagram zeichnest das sind einfaach zu viel die Datenbank und auch der Webbrowser werden doch ueberlastet mit soviel Daten.
 
BTCStorage schrieb:
Also ich denke ich muss am besten eine zweite MySQL Tabelle erstellen und in diese dann alle paar Minuten aus der original Tabelle die Daten so reinschreiben das alles zusammen gefast ist
Ja, automatisiert machen lassen. Z.b. als mean(15min) oder so. Nennt sich downsampling.
Aber ganz ehrlich: Lässt du die Datenbank auf einem Rechner aus dem Jahre 2000 laufen oder warum kann der nicht mit ein paar 10.000 Datenpunkten umgehen?
Zeitreihenbasierte Datenbanken sind für Daten mit TimeStamp effizienter
Ergänzung ()

https://docs.influxdata.com/influxdb/v1.8/guides/downsample_and_retain/
Ergänzung ()

InfluxDb ist bei einem normalen Desktop-PC dazu in der Lage:
  • more than 750,000 field writes per second
  • more than 100 moderate queries per second (see Query guides)
Es geht um 100 Abfragen (nicht Datenpunkte!) pro Sekunde...
Dementsprechend sind deine 10 Tausend Datenpunkte tendenziell kein Problem - effizienter ist natürlich ein Downsampling.

Wichtig ist auch: Welche Software verwendest du für den Plot? Und plottet der wirklich alle Datenpunkte oder nutzt der Downsampling.
Live-Downsampling im rahmen einer Query ist auch sehr performant, dann gibt dir die DB direkt die Daten aus, eben live-downgesampelt
 
Zuletzt bearbeitet:
Also das ganze nennt sich Downsampling das ist doch gut zu wissen.
Ich benutze jetzt hier Node.js und Mysql und auf der Webseite einfache Apexcharts, also ich will das ganze nicht zu sehr ueberreizen und deswegen probiere ich ueberall wo moeglch ist Resourcen zu sparen.
Im Hintergrund ist naemlich auch eine Handelsplatform die jede Sekunde die MySQL datenbank von hinten und vorne durchnimmt mit Daten reinschreiben und auslesen das jede Sekunde von einer Handelsplatform dann ist die Webseite noch am Start welche auch immer wieder was von der MySQL datenbank will und wenn nun mehrere handelsplattformen gleichzeittig Ihre Daten in die MySQL Datenbank pumpen und abziehen finde ich das es alles bisjen viel wird, also probiere ich bisjen Resourcen sparen.
 
Mit einer richtig designten Datenbank, gut normalisiert und vernünftigen Indexen (und sinnvollem Caching) kann man schon sehr viele Daten in einer Mysql-DB unter bringen ohne dass es zu langsam wird.
Aber ja, für reine Zeitreihen ist Influx eher das Mittel der Wahl.
Ansonsten: Ressourcen drauf schmeißen.
 
Zuletzt bearbeitet:
Nunja man kann ja nicht jedesmal sich umschauen nach irgendwelchen anderen Loesungen, man muss doch auch mal mit dem was man gelernt hat arbeiten.

Es wird immer schnell gesagt achja diese oder jene Loesung ist die beste, aber wie lange hast DU selbst gebraucht bist du mal bisjen richtig Javascript oder eine andere Programmiersprache gelernt hast, bist du mal mit Mysql etwas bauen konntest usw. Ich kann doch jetzt nicht daher gehen und nur wegen so ein paar Ideen anfangen neue Datenbanksysteme aus zu testen.

MySQL sollte ausreichen fuer das was ich bauen will und fuer die meisten Sachen im Prinzip.

Ich habe jetzt auch das gemacht was ich gestern gesagt habe, einfach eine zweite Tabelle erstellt in welche ich die zusammengefasten Daten speichern, alle 30 Minuten wird die Tabelle gefuellt. Das finde ich allemal besser als alle paar Sekunden MySQL durch tausende von Daten sich durchkaempfen zu lassen nur damit am Ende 500 Daten raus kommen mit der man eine Linie zeichnet. Jetzt wird das ganze einfach jede halbe Stunde einmal kurz gemacht und gut ist.

Das Thema caching habe ich schon oft gehoert im Zusammenhang mit Mysql, ist sowas kompliziert zu verstehen wie lange brauch man bis man das lernt und wie nuetzlich ist das? Gerne koennt ihr mir auch eure Tipps geben zum Thema Indexe erstellen, das hoert man ja auch oft, auf welche Art und Weise erstellt man den am besten indexe, ich waehle immer im Menue die Felder als Index aus wo ich denke das es am meisten bei Suchabfragen benutzt wird, das mache ich so nach Bauchgefuehl und mit caching habe ich mich noch nie beschaeftigt.
 
Um mal ganz direkt/ehrlich zu sein: Du scheinst hier etwas geschäftlich machen zu wollen (siehe Nickname/"Handelsbörsen" etc). Dann höre auf rumzufrickeln und stelle einen Entwickler an.

BTCStorage schrieb:
waehle immer im Menue die Felder als Index aus wo ich denke das es am meisten bei Suchabfragen benutzt
So einfach ist das leider nicht. Richtige Indizierung benötigt etwas mehr KnowHow.

BTCStorage schrieb:
einfach eine zweite Tabelle erstellt in welche ich die zusammengefasten Daten speichern, alle 30 Minuten wird die Tabelle gefuellt.
Durchaus valide Option, grad für Statistiken die nicht immer top aktuell sein müssen. Sowas lässt sich übrigens wunderbar mit Events innerhalb von Mysql bewerkstelligen, ohne dafür Scripte bemühen zu müssen.
 
Zuletzt bearbeitet:
Nunja habe ich etwa soviel Geld das ich ein Entwickler bezahlen kann?
Vielleicht habe ich einfach eine gute Idee welche ich bauen will und dann sehe was bei raus kommt, es kann nicht jeder mal eben fuer zehntausende von Euros ein Entwickler sich auch noch leisten.
Ich bin jetzt nicht der Proficoder aber habe schon genug gelernt und komme so an meine Ziele mit dem was ich baue, aber niemand weis alles, du kennst dich auch nur gut genug mit den Sachen aus welche du oft benutzt.

Es gibt so viele Programmiersprachen jede hat vielleicht irgendwo ein Vorteil gegenueber einer anderen in bestimmten Sachen, aber soll man deswegen jedesmal eine neue Programmiersprache lernen oder eine neue Datenbanktechnik, ne, man probiert am besten mit dem was man hat weis und kann was vernuenftiges zu bauen und wenn es gut ankommt kann man im nachhinein neue Versionen entwickeln.
 
BTCStorage schrieb:
Vielleicht habe ich einfach eine gute Idee welche ich bauen will
Ohne Kenntnisse? Da bleibt nur erst mal deutlich dein Know How erweitern oder halt investieren (in einen Entwickler).
Denn ich sehe an deinen Fragen, dass du hier nicht ein konkretes Problem hast, sondern Grundlagen fehlen.

BTCStorage schrieb:
ne, man probiert am besten mit dem was man hat weis
Das ist halt der falsch Ansatz. Wenn man ein Problem mit den bestehenden Mittel nicht lösen kann, muss man nach einer besseren Lösung/neuen Mittel (und damit neuen Kenntnissen) schauen. Ich lerne mind. einmal im halben Jahr eine neue Sprache/eine neue Technik oder mindestens ein neues Tool, weil ich es benötige.

Edit: das ist auch echt nicht böse gemeint. Aber vllt. solltest du einfach ne Nummer kleiner anfangen. Sonst endet das ganz schnell mit Little Bobby Tables...
 
Zuletzt bearbeitet: (typo)
  • Gefällt mir
Reaktionen: Madman1209 und kamanu
BTCStorage schrieb:
Es gibt so viele Programmiersprachen jede hat vielleicht irgendwo ein Vorteil gegenueber einer anderen in bestimmten Sachen, aber soll man deswegen jedesmal eine neue Programmiersprache lernen oder eine neue Datenbanktechnik, ne, man probiert am besten mit dem was man hat weis und kann was vernuenftiges zu bauen und wenn es gut ankommt kann man im nachhinein neue Versionen entwickeln.
Niemand hat gesagt, dass es mit MYSQL nicht geht. Aber 3 unterschiedliche Leute haben unabhängig voneinander auf einen anderen Datenbanktyp hingewiesen. Der in deinem Anwendungsfall halt massiv Sinn macht. Vor allem wenn du möglichst effizient nachher die Daten abrufen willst.
Du hast nach Hilfe gefragt und die auch bekommen. Ob du die jetzt annimmst oder ignorierst ist deine Sache.
Zum nachher neue Versionen entwickeln: Hab bisher selten erlebt, dass man nachher solche Grundsatzentscheidungen nochmal ändert. Da wird dann lieber gefrickelt bis es passt.
 
  • Gefällt mir
Reaktionen: playerthreeone
Ich weis natuerlich das es von niemanden uebel gemeint ist jeder sagt auch nur was er aus Erfahrung weis, aber wenn ich euch jetzt ein Link geben wuerde zu meinem Twitch Livestream und ihr das Program sieht was ich bereits gebaut habe wuerdet ihr auch nicht denken das es ein Anfaenger gebaut hat.

Ich bekomme die Sachen die ich bauen will schon irgendwie hin und wenn ich sehe das es gut ankommt fehlt es auch nicht an Motivation Sachen dadran zu verbessern.

Ich lerne immer nur das was ich gerade benoetige und werde mit der Zeit dann gut darin. Ich kann nicht immer ueberall alles moegliche mir aneignen weil ich auch nicht beruflich Programmierer bin, trotzdem habe ich aber in den letzten Zehn Jahren schon immer wieder nette Sachen gebaut und somit immer etwas Vorwissen und Erfahrung die ich wieder benutzen kann.

Wenn ich sehe das alles so funktioniert wie es soll bleibt es auch erst mal so, aber wenn ich sehe das etwas nicht optimal fuer mich verlaeuft kann ich auch was neues lernen.
Ergänzung ()

Ich habe hier nachfolgend ein Bild wo man sehen kann wie ich das zur Zeit aufgebaut habe.
aufbau.png



Ich habe jetzt folgende Optimierungsideen:

1. Da jeder Plattform jede Sekunde die Mysql Datenbank abfraegt nach Eintraegen aus der selben Datei koennte man auch den Webserver jede Sekunde ein Textdatei erstellen lassen welche diese Daten auch vorher aus der datenbank abfraegt, so koennte jede Plattform diese Textdatei lesen und man es mueste nicht jede Plattform immer die Mysql Datenbank selbst abfragen, also ich denke man koennte so einige Abfragen zur Datenbank einsparen.

2. Zur Zeit sendet jede Plattform Ihre Daten zur Datenbank, auch wieder per Webrequest zum Node.js Webserver und der speichert es in die Datenbank, hier denke ich koennte man auch einige Abfragen zur Datenbank einsparen wenn man in der Handelsplattform eine Textdatei erstellt wo alle Daten die gesendet werden sollen zusammen gefast sind und dann sendet die Platform diese Textdatei zum Webserver und der baut damit eine Insert into Abfrage wo alles bisjen zusammen gefast ist, also anstelle von zehn oder zwangig einzelnen Insert into Abfragen haette man dann nur ein bis zwei Stueck, ich denke das koennte auch die Performance verbessern.

Wie findet Ihr meine Ideen? Oder hat jemand noch bessere Ideen?
 
Zuletzt bearbeitet:
BTCStorage schrieb:
jede Sekunde ein Textdatei erstellen lassen
Das ist Gefrickel und kein Caching. (2x das gleiche Query kann Mysql per QueryCache (RAM!) viel schneller bedienen, als ein fopen, fread etc)
BTCStorage schrieb:
wenn man in der Handelsplattform eine Textdatei erstellt wo alle Daten die gesendet werden sollen zusammen gefast sind
Das ist noch mehr Gefrickel.

Und wenn du so programmierst wie du schreibst, verweise ich noch mal auf den kleinen Bobby.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Phrasendreher und Madman1209
Ok das hoert sich doch gut an, das heist man kann also an dem ganzen etwas verbessern ohne irgendwie noch extra Textdateien zu erstellen usw.

Also sagen wir in der Handelsplattform sind 20 Trades offen, jeder Trades aendert sich gerne mal pro Sekunde bisjen und ich will immer der neusten Stand auf der Webseite zeigen, also wie habe ich das geloest, auf folgende Weise:

1. Eine for Schleife geht alle offenen Trades durch und schreibt die Daten des Trades in ein GET Webrequest query, also z.b. ProfitzuezeitvomTrade=100&Zinsen=95&irgendeineandereinfo=wert
dieser query wird dann versendet an den Node.js Webserver und der Webserver speichert es in die Datenbank, also ganz simpler Aufbau, wo wuerde den hier jemand von euch etwas anders machen und wie? Ich hoere oft das Stichwort Cacheing, wer kann mir ein guten Link empfehlen wo ich direkt zum Thema komme ohne Stundenlang Zwicheninfos? Wenn ich caching hoere denke ich immer an Googlecache wo Webseiten gespeichert sind wie die vor einiger Zeit aussahen, ich will ja aber immer die neusten Daten weiter geben und diese Daten aendern sich ja auch, deswegen verstehe ich hier nicht auf Anhieb wie oder was Cacheing bedeutet in diesem Zusammenhang.

2. Dann haben wir noch geschlossene Trades, hier ist wieder eine for Schleife aktiv diese schaut nach wieviel geschlossene Trades in den letzten so und so viel Stunden, das koennen also auch mal ein guter Haufen an Trades sein vielleicht 50 - 100 Stueck und hier koennte ich verstehen das man sowas wie Caching machen koennte, also zumindest fuer die Sachen die noch nicht drine stehen in der Datenbank, weil geschlossene Trades aendern sich auch nicht mehr, da bleiben die infos gleich, ich lasse aber zur Zeit jede Sekunde vielleicht 100 mal die gleichen Trades per Webrequest query in die Datenbank schreiben, weil ich ja nicht weis welche daten hat die Datenbank schon, ich koennte natuerlich auch erst bei der Datenbank nachfragen ob sie diesen Trade schon hat aber das waeren ja dann wieder doppelt soviel Abfragen.

Ja und ansonsten wiederholt sich das alles, manche Daten sind oft gleich aber viele Daten aendern sich auch gerne jede Sekunde.

Die Idee irgendwie alle Daten zusammen zu fassen und per Textdatei aufeinmal zu versenden findet ihr oder DU jetzt nicht gerade besser, was fuer Tipps habt ihr fuer mich, wie koennte man das verbessern?
Ergänzung ()

Ich habe mal gerade gegoogelt und sehe das man bei MySQL diese Caching gar nicht selbst programmiert, mit folgender Abfrage kann man einfach sehen ob Cacheing aktiviert ist:

SHOW VARIABLES LIKE '%query_cache%';

ich bekomme folgendes Ergebniss:

have_query_cacheYES
query_cache_limit1048576
query_cache_min_res_unit4096
query_cache_size1048576
query_cache_strip_commentsOFF
query_cache_typeOFF
query_cache_wlock_invalidateOFF

Also das heist bei mir ist das Cacheing sowieso schon aktiv oder? Also kann ich dort nichts mehr weiter dran optimieren
 
Zuletzt bearbeitet:
Eigentlich wollte ich hier nicht mehr antworten, weil ich hier nicht wirklich Einsicht sehen.
Aber:
Ja der QueryCache ist standard on. Nur so einfach ist das nicht. Hat man 90% die gleichen Queries ist das sehr effizient. Hat man aber (wie bei mir auf Arbeit) 35+mio zufällig abgefragte Entries, eher nicht mehr. Ebenso kommt es auf Resultgröße usw. an. An dem Finetuning der Variablen kann man viel Zeit versenken.
Ebenso an korrekten Indizies (Stichwort Explain).
Aber ich glaube weiterhin, dass du dich erst mal viel mehr belesen(!) solltest. Und du dich mit dem Projekt übernimmst.
 
  • Gefällt mir
Reaktionen: Madman1209
Das Projekt ist bereits fertig gebaut und funktioniert, es handelt sich hier bei diesem Program um eine Webapp oder Dashboard und nicht etwas das mit Millionen Daten sekundenschnell irgendetwas machen soll und im Prinzip frage ich nur aus Neugier und Interesse am Lernen und Optimieren bei euch nach.

Lass es mal auch bis zu 100 oder tausend offene Trades gleichzeittig sein pro Handelsplattform da ist man doch trrotzdem noch immer weit unter den Grenzen die eine MySQL Datenbank doch bediehnen koennen sollte ohne der beste Datenbank Experte zu sein sollte man sowas schon sauber aufbauen koennen denke ich und das habe ich im Prinzip auch schon gemacht. Aber ich lerne auch gerne dazu und teile deswegen mit euch eiige Ideen und hoere mir gerne eure Antworten an.

Ich wuerde es einfach cool finden wenn das was jetzt schon funktioniert irgendwie zehn mal weniger Resourcen verbraucht dann waere es halt eben nochmal cooler aber funktioniert auch jetzt schon.

Da bei mir das MySQL Caching schon eingeschaltet ist koennte ich sowie ich das jetzt von euren Kommentaren heraus lese nur noch an so Sachen wie Indexing arbeiten.

Aber irgendwie komplett andere Techniken als Webrequest zu benutzen habe ich jetzt auch kaum gehoert von euch also scheint ihr das schon ok zu finden, sonst hoert man auch oft das man eine Websocketvebindung benutzen sollte oder keine Ahnung was es sonst noch fuer coole Sachen gibt.
 
Lass dich nicht ärgern, das ist hier immer so. Das Forum ist voll von Profientwicklern mit riesigen Stundenraten und wenn du da jetzt daher kommst und sagst, ich mach das mal eben selber und so wie ich das will, dann ist aber ganz schnell Schluss mit lustig :-)

Ich finde es aber auch schwierig etwas beizutragen, wenn noch nicht mal ganz klar ist, was du da eigentlich gebaut hast, aber wenn es funktioniert, dann herzlichen Glückwunsch. Kannst ja nach und nach weiter optimieren. Man lernt ja immer dazu.

Viel Erfolg beim Traden
 
  • Gefällt mir
Reaktionen: BTCStorage
Status
Für weitere Antworten geschlossen.
Zurück
Oben