Node.js und viele Mysql Abfragen?
Ich habe in einem Node.js script die Mysql Bibliothek (npm install mysql) und ich bemerke jetzt das alles zu langsam funktioniert sobald ich mehrere Benutzer habe.
In meinem Script sind mehrere Insert Into Abfragen an die Datenbank und ich frage mich jetzt warum das nicht optimal funktioniert. Ich dachte Node.js ist doch optimal fuer solche Sachen wenn viele Anfragen gleichzeitig verarbeitet werden sollen.
Ich benutze ein Programm womit ich alle 2 Sekunden mehrere Mysql Insert Into Abfragen an das Node.js script sende und dort faengt dann alles an immer langsamer zu funktionieren.
Ich frage mich ob ich irgendwie irgendwo etwas verbessern kann, sind die Mysql Insert Into Abfragen von der Bibliothek vielleicht nicht asynchron? Oder liegt es am Node.js express Webserver das der ueberlastet ist von zu viel Anfragen? Ich vermute ja das die vielen Mysql Abfragen der Grund sind, aber was soll man sonst benutzen fuer sowas wo viele Daten jede Sekunde hin und her gesendet werden sollen, dachte Mysql oder generell datenbank sind dafuer da.
5 Antworten
Probier statt dem mysql-Package mal das mysql2-Package. Dieses soll bessere Performance liefern.
Sonstige Punkte, welche Verbesserung bringen könnten:
- Prepared Statements nutzen
- Connection Pools nutzen
- Abfragen asynchron ausführen, wenn möglich
Je nachdem, was für Daten du dort abfragst, würde ein Cache womöglich auch Sinn ergeben.
Du darfst allgemeine Datenbankabfragen nie synchron tätigen. Verwende immer eine asynchrone Funktion mit dem Schlüsselwort "async". Dann benutze für die jeweiligen Abfragen an die Datenbank das Schlüsselwort "await" und so sollte alles schneller funktionieren, da mehrere Funktionen gleichzeitig aufgerufen werden können.
Nicht wirklich. Kenne mich da auch nicht so aus. Aber das ist nur eine Callback Funktion. Schreib anstatt function mal "async function" hin und mache dann die anderen Funktionen innerhalb dieser mit await.
Und besser: verwende gar keine Callbacks, sondern schreib einfach hinter con.query(sql).then(() => {DEINE DINGE}) hin.
Und, wenn das wirklich viele Funktionen werden kannst du bei dem Responseteil auch eine asynchrone Funktion drausmachen.
Ich habe eben das Beispiel mit Benutzen von Pools probiert und festgestellt das es aufjedenfall schnell ist jetzt da ich nicht so fit bin mit asynchron javascript werde ich etwas mehr zeit brauchen aber sobald ich etwas mehr zeit habe werde ich probieren mit await das irgendwie zu bauen, da muss ich dann experementieren aber das will ich aufjedenfall auch so mit await machen
Das klingt doch schon mal besser. Viel Erfolg weiterhin. (I use MongoDB, btw.)
Meine Abfragen sehen alle so aus:
con.query(sql, function (err, result) {
if (err) throw err;
console.log("record inserted");
});
wenn du willst gib mir noch auf die schnelle ein tipp wie man das kurz aendern muss damit es mit await richtig funktioniert, ich bin da nicht so fit mit asynchron. Ich hatte auch mal mit MongoDB was angefangen zu bauen, ist eigentlich auch super Datenbank, aber ich baue hier gerade etwas das muss schnell gehen.
Wie gesagt, mach die Funktion einfach weg und schreibe sie in con.query(sql).then(()=> {HIER SOWAS WIE CONSOLE LOG})
kommt halt darauf an wie du das gemacht hast . selber function in function ? oder mit await ?
ich benutze die standard beispiele von der Bibliothek
con.query(sql, function (err, result) {
if (err) throw err;
console.log("record inserted");
});
Die stacken sich und dabei ensteht eine verlangsamung weil sämtliche nachfragen nacheinander abgefragt werden
es ist aufjedenfall so aus. Wie kann man sowas besser machen?
Du must dir das wie eine öffnung mit filter vorstellen momenta ist dort ein schlitz drinne wo die anfragen durchkommen allerdings kannst du mit mehr leisten diesen schlitz erweitern
Mehr Hardwareleistung.
Weist du ob diese Standard Abfrage von der Bibliothek nicht schon asynchron ist?
con.query(sql, function (err, result) {
if (err) throw err;
console.log("record inserted");
});