MySQL_Get zu langsam

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
  • Heho.


    Kommen wir gleich zu meinem Problem.
    Zurzeit lade ich meine Fahrzeuge wie folgt:


    vehs[i][model] = mysql_GetInt("autos","model", "ID", "i");
    vehs[i][ahauto] = mysql_GetInt("autos","ahauto", "ID", "i");
    vehs[i][kaufbar] = mysql_GetInt("autos","kaufbar", "ID", "i");
    vehs[i][besitzer] = mysql_GetInt("autos","besitzer", "ID", "i");
    vehs[i][preis] = mysql_GetInt("autos","preis", "ID", "i");
    vehs[i][x] = mysql_GetFloat("autos","x", "ID", "i");
    vehs[i][y] = mysql_GetFloat("autos","y", "ID", "i");
    vehs[i][z] = mysql_GetFloat("autos","z", "ID", "i");
    vehs[i][rot] = mysql_GetFloat("autos","rot", "ID", "i");
    vehs[i][color11] = mysql_GetInt("autos","color1", "ID", "i");
    vehs[i][color22] = mysql_GetInt("autos","color2", "ID", "i");
    vehs[i][spoiler] = mysql_GetInt("autos","spoiler", "ID", "i");
    vehs[i][hood] = mysql_GetInt("autos","hood", "ID", "i");
    vehs[i][roof] = mysql_GetInt("autos","roof", "ID", "i");
    vehs[i][sideskirt] = mysql_GetInt("autos","sideskirt", "ID", "i");
    vehs[i][nitro] = mysql_GetInt("autos","nitro", "ID", "i");
    vehs[i][lamps] = mysql_GetInt("autos","lamps", "ID", "i");
    vehs[i][exhaust] = mysql_GetInt("autos","exhaust", "ID", "i");
    vehs[i][wheels] = mysql_GetInt("autos","wheels", "ID", "i");
    vehs[i][stereo] = mysql_GetInt("autos","stereo", "ID", "i");
    vehs[i][hydraulics] = mysql_GetInt("autos","hydraulics", "ID", "i");
    vehs[i][bullbars] = mysql_GetInt("autos","bullbars", "ID", "i");
    vehs[i][bumper] = mysql_GetInt("autos","bumper", "ID", "i");
    vehs[i][vents] = mysql_GetInt("autos","vents", "ID", "i");
    Das ganze in einer For-Schleife für die ganzen Fahrzeuge.


    Das braucht nur leider pro Fahrzeug gut 2 Sekunden. Kann ich das ganze irgendwie verkürzen, indem ich das alles in einen Query oder so mache?


    Gruß,
    Neo. :)

  • Du bist dir aber sicher,dass das überhaupt funktioniert ?

    Zitat

    vehs[i][model] = mysql_GetInt("autos","model", "ID", "i");


    Wieso hast denn als 4. Parameter "i" ?


    Zitat

    Kann ich das ganze irgendwie verkürzen, indem ich das alles in einen Query oder so mache?


    Wäre gut.
    Das Stichwort dazu wäre SELECT. Google hilft dir da sicherlich.

  • Kann ich das ganze irgendwie verkürzen, indem ich das alles in einen Query oder so mache?


    Natürlich! Das macht das ganze viel schneller und Ressourcenfreundlicher, da die mysql_get... Funktionen pro Aufruf ein Query senden. Da Pawn keine Multi-Threads unterstützt ( =mehrere Aufgaben gleichzeitig bearbeiten können) wartet der gesamte Server, bis die Ergebnisse der Querys da sind. Solange kann der Server nichts machen, auch keine Spieler-Synchronisation (Es kommt zu starken Laggs). Das ganze in einem Query zu machen ist schon mal viel besser, doch ein MySQL Plugin zu benutzen, das Threaded ist, ist noch besser.


    Für das Laden mit einem Query lege ich dir sscanf ans Herz. Ein Bsp. da mit:



    new data[350];
    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    while(mysql_fetch_row(data)) //Solange eine Zeile aus dem Ergebnis geladen werden kann
    {
    sscanf(data, "p<|>iii.....", vehs[i][model],...); //Musst du selber machen
    }


    Man kann mit sscanf sogar Daten direkt ins Enum laden lassen, wie das geht steht hier.


    Ich hoffe ich habe es einigermaßen verständlich erklärt. :)

  • Peinlich. :X


    Naja, danke euch :P


    UncleSub:


    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    while(mysql_fetch_row(data))
    {
    sscanf(data, "p<|>iiiiiffffiiiiiiiiiiiiiii", vehs[i][model],vehs[i][ahauto],vehs[i][kaufbar],vehs[i][besitzer],vehs[i][preis],vehs[i][x],vehs[i][y],vehs[i][z],vehs[i][rot],vehs[i][color11],vehs[i][color22],vehs[i][spoiler],vehs[i][hood],vehs[i][roof],vehs[i][sideskirt],vehs[i][nitro],vehs[i][lamps],vehs[i][exhaust],vehs[i][wheels],vehs[i][stereo], vehs[i][hydraulics],vehs[i][bullbars],vehs[i][bumper],vehs[i][vents]);
    printf("%f Float - %i Model", vehs[i][x], vehs[i][model]);
    }


    So sieht das gerade bei mir aus. Geht auch sehr schnell.
    Allerdings printet er mir nur 0'len raus, was bedeutet, dass er es nicht richtig läd. :/


    (Es langt doch der SSCANF Code dafür, oder?)
    In der Datenbank sind alle Models auf 411 und die X,Y und Z von dem ersten auf 1.0.


    Gruß,
    Neo. :)

  • Du musst wirklich alle Daten eintragen, die auch in der Datenbank sind, ansonsten musst du quiet Sections nutzen. Denn in dem Data String sind die alle Daten aus einer Zeile enthalten. Mit den quiet Sections kannst du sscanf sagen, dass in dem String Daten sind, die er aber nicht "beachten" soll.


    Zitat von Y_Less


    The two new specifiers "{" and "}" are used for what are known as "quiet" strings. These are strings which are read and checked, but not saved. For example:


    sscanf("42 -100", "{i}i", var);


    Clearly there are two numbers and two "i", but only one return variable. This is because the first "i" is quiet so is not saved, but affects the return value. The code above makes "var" "-100".

  • Oder du bist so klug und lässt mySQL die Arbeit machen, indem du eben nicht einfach * (ALLES) selectest, sondern nur die Felder, die für dich von Nöten sind.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • public loadvehs()
    {
    new data[350];
    new max = count("autos");
    for(new i; i <= max; i++)
    {
    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    while(mysql_fetch_row(data))
    {
    sscanf(data, "p<|>iiiiiiffffiiiiiiiiiiiiiii", vehs[i][ID],vehs[i][model],vehs[i][ahauto],vehs[i][kaufbar],vehs[i][besitzer],vehs[i][preis],vehs[i][x],vehs[i][y],vehs[i][z],vehs[i][rot],vehs[i][color11],vehs[i][color22],vehs[i][spoiler],vehs[i][hood],vehs[i][roof],vehs[i][sideskirt],vehs[i][nitro],vehs[i][lamps],vehs[i][exhaust],vehs[i][wheels],vehs[i][stereo], vehs[i][hydraulics],vehs[i][bullbars],vehs[i][bumper],vehs[i][vents]);
    }
    printf("%f Float - %i Model", vehs[i][x], vehs[i][model]);
    /*vehs[i][ID] = i;
    vehs[i][model] = mysql_GetInt("autos","model", "ID", i);
    vehs[i][ahauto] = mysql_GetInt("autos","ahauto", "ID", i);
    vehs[i][kaufbar] = mysql_GetInt("autos","kaufbar", "ID", i);
    vehs[i][besitzer] = mysql_GetInt("autos","besitzer", "ID", i);
    vehs[i][preis] = mysql_GetInt("autos","preis", "ID", i);
    vehs[i][x] = mysql_GetFloat("autos","x", "ID", i);
    vehs[i][y] = mysql_GetFloat("autos","y", "ID", i);
    vehs[i][z] = mysql_GetFloat("autos","z", "ID", i);
    vehs[i][rot] = mysql_GetFloat("autos","rot", "ID", i);
    vehs[i][color11] = mysql_GetInt("autos","color1", "ID", i);
    vehs[i][color22] = mysql_GetInt("autos","color2", "ID", i);
    vehs[i][spoiler] = mysql_GetInt("autos","spoiler", "ID", i);
    vehs[i][hood] = mysql_GetInt("autos","hood", "ID", i);
    vehs[i][roof] = mysql_GetInt("autos","roof", "ID", i);
    vehs[i][sideskirt] = mysql_GetInt("autos","sideskirt", "ID", i);
    vehs[i][nitro] = mysql_GetInt("autos","nitro", "ID", i);
    vehs[i][lamps] = mysql_GetInt("autos","lamps", "ID", i);
    vehs[i][exhaust] = mysql_GetInt("autos","exhaust", "ID", i);
    vehs[i][wheels] = mysql_GetInt("autos","wheels", "ID", i);
    vehs[i][stereo] = mysql_GetInt("autos","stereo", "ID", i);
    vehs[i][hydraulics] = mysql_GetInt("autos","hydraulics", "ID", i);
    vehs[i][bullbars] = mysql_GetInt("autos","bullbars", "ID", i);
    vehs[i][bumper] = mysql_GetInt("autos","bumper", "ID", i);
    vehs[i][vents] = mysql_GetInt("autos","vents", "ID", i);*/
    aCars[i] = AddStaticVehicleEx(vehs[i][model], vehs[i][x], vehs[i][y], vehs[i][z], vehs[i][rot], vehs[i][color11],vehs[i][color22],-1);
    if(vehs[i][ahauto] == 1 && vehs[i][kaufbar] == 1)
    {
    format(sString, sizeof(sString), "Model: %i\nPreis: %i€", vehs[i][model], vehs[i][preis]);
    vehLabel[i] = Create3DTextLabel(sString, 0xFF0000FF,0.0, 0.0, 0.0, 50.0, 0, 1 );
    Attach3DTextLabelToVehicle(vehLabel[i], i, 0.0, 0.0, 2.0);
    }
    }
    return 1;
    }


    stock count(Table[])
    {
    new Query[128], count1;
    format(Query, sizeof(Query), "SELECT * FROM `%s`",Table);
    mysql_query(Query);
    mysql_store_result();
    count1 = mysql_num_rows();
    mysql_free_result();
    return count1;
    }

  • Du musst entweder while oder for benutzen beides funktioniert so nicht:


    public loadvehs()
    {
    new data[350];
    new max = count("autos");
    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    while(mysql_fetch_row(data))
    {
    sscanf(data, "p<|>iiiiiiffffiiiiiiiiiiiiiii", vehs[i][ID],vehs[i][model],vehs[i][ahauto],vehs[i][kaufbar],vehs[i][besitzer],vehs[i][preis],vehs[i][x],vehs[i][y],vehs[i][z],vehs[i][rot],vehs[i][color11],vehs[i][color22],vehs[i][spoiler],vehs[i][hood],vehs[i][roof],vehs[i][sideskirt],vehs[i][nitro],vehs[i][lamps],vehs[i][exhaust],vehs[i][wheels],vehs[i][stereo], vehs[i][hydraulics],vehs[i][bullbars],vehs[i][bumper],vehs[i][vents]);
    printf("%f Float - %i Model", vehs[i][x], vehs[i][model]);
    /*vehs[i][ID] = i;
    vehs[i][model] = mysql_GetInt("autos","model", "ID", i);
    vehs[i][ahauto] = mysql_GetInt("autos","ahauto", "ID", i);
    vehs[i][kaufbar] = mysql_GetInt("autos","kaufbar", "ID", i);
    vehs[i][besitzer] = mysql_GetInt("autos","besitzer", "ID", i);
    vehs[i][preis] = mysql_GetInt("autos","preis", "ID", i);
    vehs[i][x] = mysql_GetFloat("autos","x", "ID", i);
    vehs[i][y] = mysql_GetFloat("autos","y", "ID", i);
    vehs[i][z] = mysql_GetFloat("autos","z", "ID", i);
    vehs[i][rot] = mysql_GetFloat("autos","rot", "ID", i);
    vehs[i][color11] = mysql_GetInt("autos","color1", "ID", i);
    vehs[i][color22] = mysql_GetInt("autos","color2", "ID", i);
    vehs[i][spoiler] = mysql_GetInt("autos","spoiler", "ID", i);
    vehs[i][hood] = mysql_GetInt("autos","hood", "ID", i);
    vehs[i][roof] = mysql_GetInt("autos","roof", "ID", i);
    vehs[i][sideskirt] = mysql_GetInt("autos","sideskirt", "ID", i);
    vehs[i][nitro] = mysql_GetInt("autos","nitro", "ID", i);
    vehs[i][lamps] = mysql_GetInt("autos","lamps", "ID", i);
    vehs[i][exhaust] = mysql_GetInt("autos","exhaust", "ID", i);
    vehs[i][wheels] = mysql_GetInt("autos","wheels", "ID", i);
    vehs[i][stereo] = mysql_GetInt("autos","stereo", "ID", i);
    vehs[i][hydraulics] = mysql_GetInt("autos","hydraulics", "ID", i);
    vehs[i][bullbars] = mysql_GetInt("autos","bullbars", "ID", i);
    vehs[i][bumper] = mysql_GetInt("autos","bumper", "ID", i);
    vehs[i][vents] = mysql_GetInt("autos","vents", "ID", i);*/
    aCars[i] = AddStaticVehicleEx(vehs[i][model], vehs[i][x], vehs[i][y], vehs[i][z], vehs[i][rot], vehs[i][color11],vehs[i][color22],-1);
    if(vehs[i][ahauto] == 1 && vehs[i][kaufbar] == 1)
    {
    format(sString, sizeof(sString), "Model: %i\nPreis: %i€", vehs[i][model], vehs[i][preis]);
    vehLabel[i] = Create3DTextLabel(sString, 0xFF0000FF,0.0, 0.0, 0.0, 50.0, 0, 1 );
    Attach3DTextLabelToVehicle(vehLabel[i], i, 0.0, 0.0, 2.0);
    i++;//am ende i immer eins hochzählen lassen
    }
    }
    return 1;
    }

  • Du hast bereits einen Denkfehler in deinem Ansatz. Du benutzt eine for-Schleife, in der du ein Query ausführst. Das ganze wird also mehrmals ausgeführt und es wird immer das selbe gemacht.
    Die Schleife kannst du dir Sparen. Du kannst eine Variable erstellen, die nach jedem Durchlauf der while Schleife um eins erhöht wird, oder die Daten, zum Erstellen des Autos vorher in Temporäre (Lokale) Variablen speichern, das Auto erstellen und die Daten dann unter dem Index der carid abspeichern.

  • Habe es jetzt so, wie Bluescreen es schrieb.


    Code
    printf("%f Float - %i Model", vehs[i][x], vehs[i][model]);


    Das Model zeigt er mir bei jedem richtig an. Das x ist leider überall auf 0, obwohls in der Datenbank einen Wert hat.


    while(mysql_fetch_row(data))
    {
    sscanf(data, "p<|>iiiiiiffffiiiiiiiiiiiiiii", vehs[i][ID],vehs[i][model],vehs[i][ahauto],vehs[i][kaufbar],vehs[i][besitzer],vehs[i][preis],vehs[i][x],vehs[i][y],vehs[i][z],vehs[i][rot],vehs[i][color11],vehs[i][color22],vehs[i][spoiler],vehs[i][hood],vehs[i][roof],vehs[i][sideskirt],vehs[i][nitro],vehs[i][lamps],vehs[i][exhaust],vehs[i][wheels],vehs[i][stereo], vehs[i][hydraulics],vehs[i][bullbars],vehs[i][bumper],vehs[i][vents]);
    printf("%f Float - %i Model", vehs[i][x], vehs[i][model]);
    AddStaticVehicleEx(vehs[i][model], vehs[i][x], vehs[i][y], vehs[i][z], vehs[i][rot], vehs[i][color11],vehs[i][color22],-1);
    i++;
    }


    Output:


    Code
    [18:57:20] 0.000000 Float - 425 Model
    [18:57:20] 0.000000 Float - 465 Model
    [18:57:20] 0.000000 Float - 465 Model
    [18:57:20] 0.000000 Float - 411 Model
    [18:57:20] 0.000000 Float - 498 Model
    [18:57:20] 0.000000 Float - 498 Model
    [18:57:21] 0.000000 Float - 498 Model
    [18:57:21] 0.000000 Float - 589 Model
    [18:57:21] 0.000000 Float - 589 Model
    usw..