Extremer Laqq nach /saveaccounts

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • So,


    ich weis, ich hasse mysql inzwischen auch:D, aber, wenn wir bei einem 100 Mann Server


    /saveaccounts eingeben, um alle Accountdaten zu speichern gibt es einen rießenlaqq, hier mein Aufbau:


    stock SaveAllAccounts(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    if(gPlayerLogged[playerid])
    {
    if(mysqluser[playerid] == 1)
    {
    mysql_SetInt("accounts", "Level", PlayerInfo[playerid][pLevel], "Name", PlayerInfo[playerid][pIngameName]);
    mysql_SetFloat("accounts", "pSHealth", PlayerInfo[playerid][pSHealth], "Name", PlayerInfo[playerid][pIngameName]);
    mysql_SetString("accounts", "MarriedTo", PlayerInfo[playerid][pMarriedTo], "Name", PlayerInfo[playerid][pIngameName]);
    }
    }
    }
    return 1;
    }


    funktionen:


    stock mysql_SetInt(Table[], Field[], To, Where[], Where2[])
    {
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE %s SET %s = '%d' WHERE %s = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetString(Table[], Field[], To[], Where[], Where2[])
    {
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(To, To);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE %s SET %s = '%s' WHERE %s = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetFloat(Table[], Field[], Float:To, Where[], Where2[])
    {
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE %s SET %s = '%.1f' WHERE %s = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }


    Wäre sehr nett, wenn ihr mir weiterhelfen könntet.



    MfG. Cody09

  • Benutzt das Plugin von strickenkid, da laggt es sicherlich nicht soviel wie das von G-Stylez.
    PS: Ist selbstverständlich, dass 100x der Char ausgeführt wird und es zu einem Sever lagg kommen kann.
    Lieber die Accounts immer beim Disconnecten speichern!

  • Meine Prognose:


    INSERT 36 MS
    UPDATE 16 MS


    Durchschnitt bei einer 10000 schleife


    Du hast Für jede(n) Variable,Integer ein weiteren Update ...


    Bei dem Raven's Roleplay sind das 229 Variablen & integer's die gespeichert werden...
    ((229*16)*100)/1000 = 366,4 Sekunden! Sind über 5Minuten die er nur mit dem Speichern braucht ...Deshlab die Laggs


    Ich würde an deiner (eurer) stelle das Speichern über 4 Große Strings machen!
    ((4*16)*100)/1000 = 6,4 Sekunden, die merkt man schon fast gar nicht mehr ... am besten ist es allerdings über ein riesen string ... wäre dann knapp über 1 Sekunde ...


    Ist zwar viel fummel kram ...


    Beispiel:

    new Querys[8][256],MasterQuery[2222];
    format(Querys[0],256,"`Level`='%d',`Adminlevel`='%d'",
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pAdmin]
    );
    format(Querys[1],256,"`MarriedTo`='%s',`/*Weiter :D*/`='/*huhu*/'",
    PlayerInfo[playerid][pMarriedTo],
    /*PlayerInfo[playerid][...]*/
    );
    format(Querys[2],256,"");
    format(Querys[3],256,"");
    format(Querys[4],256,"");
    format(Querys[5],256,"");
    format(Querys[6],256,"");
    format(Querys[7],256,"");
    format(MasterQuery,sizeof(MasterQuery),"UPDATE `Accounts` SET %s,%s,%s,%s,%s,%s,%s,%s WHERE `Spielername`=%s",Querys[0],Querys[1],Querys[2],Querys[3],Querys[4],Querys[5],Querys[6],Querys[7],ReturnPlayerName(playerid));

    Hinten und vorne bei den 'Querys[x]' kein komma!

  • in deinem beispiel sind es 8 :D, ok ein Riesen string sieht dann so aus z.B.


    [code]
    format(MasterQuery,sizeof(MasterQuery),"UPDATE `Accounts` SET `Level`='%d',`Adminlevel`='%d',`MarriedTo`='%s' WHERE `Spielername`=%s",
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pAdmin],
    PlayerInfo[playerid][pMarriedTo],
    ReturnPlayerName(playerid));


    Also dann halt mit allen Werten ok. Oder gehts noch ressourcensparender mit anderen funktionen?

  • Nunja, ich hatte auch das Problem mit MySQL das aber schon 1 Account ca. 2 Sekunden gebraucht hat...
    Darauf hin hat mein Techniker einfach ein wenig die "Cache" des MySQL Servers erhöhrt und schwubbs... 24 Millisekunden ;D
    Teilweise gibt es zwar noch bischen höhere Zeiten aber schon deutlich schneller wie vorher. :)

  • new Querys[8][256],MasterQuery[2222];
    format(Querys[0],256,"`Level`='%d',`Adminlevel`='%d'",
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pAdmin]
    );
    format(Querys[1],256,"`MarriedTo`='%s',`/*Weiter :D*/`='/*huhu*/'",
    PlayerInfo[playerid][pMarriedTo],
    /*PlayerInfo[playerid][...]*/
    );
    format(Querys[2],256,"");
    format(Querys[3],256,"");
    format(Querys[4],256,"");
    format(Querys[5],256,"");
    format(Querys[6],256,"");
    format(Querys[7],256,"");
    format(MasterQuery,sizeof(MasterQuery),"UPDATE `Accounts` SET %s,%s,%s,%s,%s,%s,%s,%s WHERE `Spielername`=%s",Querys[0],Querys[1],Querys[2],Querys[3],Querys[4],Querys[5],Querys[6],Querys[7],ReturnPlayerName(playerid));


    das ist dann ein riesen string, wie MyKevin es beschrieben hat oder? Da ja nur 1x eine Query ausgeführt wird


    oder? Ich komme grade irgendwie durcheinander sry

  • thx, hilft mir net so, aber grade mal geschaut, da steht ziehmlich viel: http://dev.mysql.com/doc/refman/5.1/de/query-speed.html



    //edit:


    Wieder ein neues Problem:


    Jetzt wollte ich es so machen wie kevin, jetzt sieht es so, aus, werte natürlich verändert:


    new Querys[10][1000],MasterQuery[6700];


    format(Querys[1],600,"Level ='%d'",
    PlayerInfo[playerid][pLevel]);


    format(Querys[2],600,"`Telefonbuch`='%d'",
    PlayerInfo[playerid][pPhoneBook]);


    format(Querys[3],600,"`Materialien`='%d'",
    PlayerInfo[playerid][Materialien],);


    format(Querys[4],600,"`FischSkill`='%d'",
    PlayerInfo[playerid][pFishSkill]);


    //habe werte rausgeschnitten, das ganze geht bis Querys[9]


    format(MasterQuery,sizeof(MasterQuery),"UPDATE `accounts` SET %s,%s,%s,%s,%s,%s,%s,%s,%s WHERE `Name`=%s",Querys[1],Querys[2],Querys[3],Querys[4],Querys[5],Querys[6],Querys[7],Querys[8],Querys[9],PlayerInfo[playerid][pIngameName]);
    mysql_query(MasterQuery);



    So, es geht GAR nichts, kein Speichern etc. und wenn ich /saveaccount mache der die Funktion zum speichern aufruft stürzt der Server ab, mysql errors: keine


    MfG. Cody09 wäre nett wenn mir jemand helfen könnte

    Einmal editiert, zuletzt von Cody09 ()

  • Ich weiß nicht ob du strickenkids Plugin benutzt aber, bau einfach eine 2 MySQL Connection auf.. Und die 2 benutzt du einfach halt fürs Speichern.
    z.B dann mysql_query(query, -1, -1, MySQLConnectionb2);

  • jd du schreibst manchmal so nen schrott das gibbet net :pinch: wieso soll er nee zweite connection aufbauen wenn schon eine besteht ?!? :|

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • jd du schreibst manchmal so nen schrott das gibbet net :pinch: wieso soll er nee zweite connection aufbauen wenn schon eine besteht ?!? :|

    Wenn du meinst, ich schreib "schrott" dann lern selbst erstmal das zu verstehen und nicht bei jedem Thread etwas nachzufragen, was dies sein solle. Etwas kreativ muss du schon selbst sein, um es zu verstehen. Er soll eine zweite Connection fürs Speichern und etliche andere Dinge nutzen, sodass die 1 MySQL nicht so laggt wie die 2. Wenn die Query aufs 1 Gespeichert wird, mit mehreren Spielern belastet es doch nur die Connection, schonmal daran gedacht? Das alles wird an MySQL gesendet und 2 MySQL Connections sind halt manchmal stabiler als einem! Und bei mir - benutzte ich 2 Connections für z.B die Accounts zu saven, damit es bei mehreren Spielern nicht laggt und natürlich klappt dies auch.


    PS: Benutzt lieber das Plugin von stricken, dann kannste auch zwei Connections aufbauen, da ich nicht weiß ob es bei Gstylez Plugin möglich ist.