Laden...

Aus Performancegründen: Wie kann ich MySQL & SQlite miteinander syncronisieren?

Erstellt von deluxe13 vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.472 Views
D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren
Aus Performancegründen: Wie kann ich MySQL & SQlite miteinander syncronisieren?

Hallo Ihr lieben,

folgendes und zwar arbeite ich momentan an einem Projekt wo ich auf eine Externe Datenbank zugreifen muss, in meinem Fall mit Mysql. Nun habe ich das Problem, das die anfragen leider zu lange dauern, es geht um eine ReservierungsSoftware, ich habe hier das Problem, das die anfragen ob ein Datum frei ist "<" ">" usw. leider sehr viel zeit in Anspruch nimmt.

Nun habe ihc mir überlegt, einfach eine SQLite noch anzulegen, diese in bestimmten Abständen mit der Mysql zu synchronisieren, ich denke die Sqlite würde lokal viel schneller ein ergebniss liefern.

Nun meine Frage, ich meine es ist möglich beide zu synchroniseren, hat jemand vielleicht dazu ein Beispiel?

Hat jemand vlt. noch eine bessere idee, wie ich Datums anfragen sehr schnell anfragen kann,
mein String sieht im moment so aus :

 string selectQuery = "SELECT * FROM T1 WHERE beginn > '" + bsaat + "' AND beginn < '" + endtime + "' OR ende > '" + bsaat + "' AND beginn < '" + endtime + "' OR '" + bsaat + "' > beginn AND '" + bsaat + "' < ende OR '" + endtime + "' > beginn AND '" + bsaat + "' < ende ";
            command = new MySqlCommand(selectQuery, connection);

?( 👍

P
441 Beiträge seit 2014
vor 5 Jahren

Hi,

hast du denn einmal geprüft, woran es wirklich liegt?
Benötigt die Selektion in MySQL so lange oder liegt es am Transportweg?

Wenn es am Transportweg liegt (was ich mir fast nicht vorstellen kann, ausser du hast eine echt langsame Internetanbindung) dann könnte die SQLite helfen.
Liegt es an der Abfrage wird es vermutlich nur langsamer werden durch die SQLite (vorausgesetzt, der DB Server liegt nicht unter zuviel Last).
Was dir da helfen könnte wäre ein passenderes DB Layout (evtl. fehlen ja auch nur Indizes??) in der MySQL.

Bitte beachte, dass aus Sicherheitsgründen ein lokaler Client nicht direkt mit der DB kommunizieren sollte, sondern soetwas wie eine HTTP Api dazwischen liegen sollte.
Ausserdem solltest du unter keinen Umständen SQL Abfragen per String-Verkettung erstellen, sondern mit Parametern arbeiten: [Artikelserie] SQL: Parameter von Befehlen
Auch würde ich an deiner Stelle mit Klammerungen arbeiten, damit du genau bestimmen kannst, welche deiner WHERE Bedingungen wie verknüpft werden. Um deinen Query zu verstehen müsste ich jetzt nachschlagen, was höher priorisiert ist (AND oder OR), mit Klammern wird es lesbarer.

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren

Vielen Dank für deine Antwort,

ich möchte eigentlich nur anfragen ob ein Tisch zu einer Zeit frei ist.
Im moment. löse ich es so, dass ich mit AND/OR und "<" ">" Anfrage auf dem Mysql mache. Und die Anfrage wird halt je nach anzahl der Tische gemacht, zb. 10 tische, wird die anfrage hintereinander 10 mal durchgeführt.
Ich nehme an das es deswegen solange dauert.

Hat jemand vlt. eine Idee, wie ich am besten solche Anfragen machen kann? also "nachschuen ob ein datum frei ist"

P
441 Beiträge seit 2014
vor 5 Jahren

Um meine Fragen noch einmal zu konkretisieren:
-> Hast du Indizes auf den Datumsspalten in der MySQL
-> Wie lange dauert genau eine solche Anfrage, wenn du sie nicht über dein Programm, sondern über z.B. PHPMyAdmin laufen lässt (lokal auf dem Server)
-> Hast du einmal Zeiten gemessen? (Query Laufzeit direkt auf dem Server, vs. Laufzeit in deinem Programm)

Wenn du nur wissen willst, ob ein Tisch frei ist würde sich vielleicht eine COUNT() Abfrage anbieten, die die Reservierungen zählt, die in einem bestimmten Zeitbereich für einen Tisch liegen, allerdings auch hier wieder der Punkt -> Hast du Indizes auf den Datumsspalten?

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren

Danke nochmals für deine Antwort,

ich habe keine Indizien, zumindest habe ich auch nie mit solchen gearbeitet, bin recht neu in der ganzen materie und versuche mich durchzuschlagen.

Die Anfrage ist auf dem Mysql fast genauso schnell wie auf meinem Programm. ca. 0,5sek, das ist ganz gut, aber wenn ich 10 tische anfrage sind es 5 Sekunden, und würde die Zeit doch gerne verkürzen, weil ggf. neue tische dazu kommen könnten.

16.842 Beiträge seit 2008
vor 5 Jahren

ich habe keine Indizien, zumindest habe ich auch nie mit solchen gearbeitet, bin recht neu in der ganzen materie und versuche mich durchzuschlagen.

Indizes (alternativ Indexe) - nicht Indizien. Ist kein Kriminalfall hier 😉

Die Anfrage ist auf dem Mysql fast genauso schnell wie auf meinem Programm. ca. 0,5sek, das ist ganz gut, aber wenn ich 10 tische anfrage sind es 5 Sekunden

Bei so wenig Daten spricht vieles dafür, dass was auf der Datenbank nicht stimmt, was das Schema betrifft.
Eine Synchronisation von Datenbanken ist ein relativ komplexes Thema und sollte nur gemacht werden, wenn es auch wirklich technisch notwendig ist.
Ansonsten gilt es eher das Thema versuchen zu vermeiden - und hier sehe ich es als absolut vermeidbar an.

Vor allem wenn Du in diesem Thema neu bist, dann ist DB-Synchronisation ein viel größerer Schritt als ein sauberer Datenbankaufbau.

Ansonsten unbedingt [Artikelserie] SQL: Parameter von Befehlen anschauen.
Dein SQL ist nicht nur sehr unsauber, sondern auch unsicher.

T
2.224 Beiträge seit 2008
vor 5 Jahren

Auch fehlen in der Beispiel Anfrage zwingend Klammern.
Deine aktuelle Abfrage ist ein wilder Mix aus AND/OR Verknüfpungen die nicht das korrekte Ergebnis liefern werden.

Ansonsten solltest du dir das Thema Indizies bei Datenbanken anschauen.
Spätestens wenn es mal mit großen Datentabellen samt Verknüpfungen arbeiten willt, kommst du für gute Performance nicht an Indizes vorbei!

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren

Danke werde ich mir anschauen.

vlt ist das meine lösung, aber die abfrage für das bestimmte datum kann ich doch nur mit and/or abfragen oder?

16.842 Beiträge seit 2008
vor 5 Jahren

Prinzipiell ja, aber bitte nicht mit diesem String-Gebastle, sondern mit Parametern.
Die Parameter sind auch so intelligent, dass sie an den notwendigen Stellen die Quotes setzen.

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren

Ich bins nochmal 🤔

reicht es wenn ich die indizes für beide Datumsbereiche lege, also "beginn" und "ende" (beide Datetime ) dann als Index ?.
Ändert sich dann auch die abfrage

W
955 Beiträge seit 2010
vor 5 Jahren

Wenn du überprüfen willst ob sich zwei Perioden überschneiden kommst du mit zwei Ausdrücken zurecht:


Start vorhandene Reservierung < Ende neue Reservierung && 
Start neue Reservierung < Ende vorhandene Reservierung

Du könntest vllt also erst einmal die Anfrage vereinfachen.

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 5 Jahren

Leider nicht ganz, nehmen wir an

bestehender Termin 15:00 - 19:00
neue Termin 12:00-20:00
würde die Anfrage eine falsche antwort liefern

weil startalt - start neu nicht überschneidet
und ende alt - ende neu auch nicht.

W
955 Beiträge seit 2010
vor 5 Jahren

Und ob das stimmt:
* 15:00 < 20:00
* 12:00 < 19:00
Bitte Formel genau lesen.