C++ & Mysql - Performance ?



  • Hi all,

    ich habe mir in C++ ein Programm geschrieben, welches in meiner Mysql-Datenbank 200.000 Datensätze updatet.

    Nur dauert das sehr sehr lange.

    In erster Linie lese ich ca. 60.000 Datensätze aus. Danach Update ich (im ZUsammenhang von meheren Tabellen) wiederum mind. 60-200.000 Datensätze.

    Ich habe eine Athlon XP 1800+ 500 DDR-RAM. Festplatte auch nicht wirklich die Neuste.

    Das Update dauert sicherlich 10-20 Minuten. Nur stellt sich die Frage, ist das wirklich ein Hardware abhängiges Problem ?

    Im Quellcode benutzte ich eigentlich sehr einfache ausdrücke bzw. Algorithmen(eig. sehr schnell).

    Ein weiteres Problem ist die Handhabung mit den ganzen Mysql(oder anderen DB)-Datentypen.

    Wenn ich diese auslese bekomme ich das ganze als String zurückgegeben, und muss für jeden Datensatz sehr umständliche Typenumwandlungen durchführen.
    Kann man das nicht irgendwie eleganter lösen.

    Wie wäre denn ein sehr guter Ansatz, zentrale Datensätze zu Bilden, um wirklich mit jeder Datenbank arbeiten zu können (zb. PostSQL, Mysql, DB2,...usw).

    Gibt es dabei schon normierte Datensatzstrukturen, und definiert man die sich einfach selber?

    Für ein paar Antworten oder weiteren Links würde ich mich sehr freuen.

    Mfg JayJay



  • Hi,

    du musst mal dein problem genauer beschreiben. Heisst update dass du die datensätze im speicher veränderst oder dass du ein sql-update query gegen die db feuerst ? Um die performance der db zu verbessern müsste man mal das shema sehen und schauen ob sich da nicht was optimieren lässt.

    Was dein zweites problem angeht, so wäre in diesem fall wohl ein wrapper angebracht der die ganzen details vor dem client versteckt und ein einheitliches interface bietet. Was intern dann passiert hängt von der verwendeten datenbank ab. Dass das nicht 100%ig funktioniert sollte aber klar sein, da es zum teil recht unterschiedliche datenbanken gibt, bei denen man recht unterschiedlich das selbe problem angeht.



  • JayJay schrieb:

    Wenn ich diese auslese bekomme ich das ganze als String zurückgegeben, und muss für jeden Datensatz sehr umständliche Typenumwandlungen durchführen.

    Die Daten gleich Binär in die Datenbank reinspeichern.
    Dann reicht ein simpler type-cast um die Daten wieder in eine "normale" Variable
    reinzubekommen.
    Bsp:

    // worst case: alle Zeichen escapen + \0
    char * escapedData = new char[sizeof(int)* 2 + 1];
    
    int x = 25;
    mysql_real_escape_string(dbHandle, escapedData, &x, sizeof(int));
    

    Die Anfrage schaut dann ganz einfach so aus:

    "insert into myTable (binaryData) values ('" + escapedData + "')"
    

    Als Datentyp für die Spalte "binaryData" in der Tabelle eignet sich z. B.
    ein char(4) oder auch ein varchar, evtl auch ein int.
    Hauptsache 4 Byte gross ( genauer: sizeof(int) gross)

    Bei der Abfrage dann einfach:

    int x;
    
        while(row = ...)
        {
        // row[spaltenNummer] liefert einen char *
        // diesen nach int * casten, dann derefernzieren und 
        // den Wert dem x zuweisen
        x = *((int *)(*(row[ spaltenNummer ]))
        }
    

    Nachteil dieser Methode:
    wenn man sich mittels mysql.exe auf der Konsole verbindet,
    kommt bei der Abfrage natürlich nur Müll raus.

    mfg
    Martin

    PS:
    habs obiges Beispiel ned getestet, aber so in etwa haut das hin



  • Hi,

    das schaut wirklich gut aus. Nur ist das ganze Fraglich wie ich die Daten in PHP in eine leserliche Form bekomme.

    Ich möchte die Daten in C++ Updaten und über PHP anzeigen lassen.

    In php bekomm ich nun dann das Problem, die Typenmwandlungen durchzuführen?

    Mfg



  • Sorry, aber die Idee von anonymus ist nicht so toll, um es diplomatisch auszudrücken. 😉 Das erste Problem daran hast du ja erkannt, JayJay. Man macht mit damit das ganze Typsystem innerhalb der DB kaputt bzw. umgeht diese.

    Ich kenne die MySQL-API nicht, aber mich wundert doch sehr, das alles nur als String zurück kommt? Wenn dem wirklich so ist, gehört das Ding in die Tonne! 👎



  • Hi,

    dem ist nicht so, jedenfalls nicht bei mysql++. Da gibt es convertierungsmethoden. Man muss sich eben nur die referenz anschaun.



  • Ich wuerd empfehlen, das Programm erst mal zu profilen, dann siehst du, wo du wirklich die Zeit verlierst und weisst, worauf du dich konzentrieren musst 🙂



  • Artchi schrieb:

    Sorry, aber die Idee von anonymus ist nicht so toll, um es diplomatisch auszudrücken. 😉

    🙄
    Aber es erspart aufwendige Konvertierungen von char * nach z. B. int und umgekehrt.
    Ob es gut oder schlecht ist hängt imho vom Einsatzzweck ab.
    Wenn es rein um die Daten geht und man keine Datenbankoperationen wie
    suchen, sortieren usw. auf dieser Spalte braucht,
    warum nicht?

    Artchi schrieb:

    Ich kenne die MySQL-API nicht, aber mich wundert doch sehr, das alles nur als String zurück kommt? Wenn dem wirklich so ist, gehört das Ding in die Tonne! 👎

    Was sollte sonst zurückkommen?
    Genau das, was man vorher reingesteckt hat.
    Also ganz normale Zeichen, auch wenn die innerhalb der Datenbank
    anders (also wie Zahlen) behandelt werden.
    Eine herkömmliche Anfrage besteht nun mal aus ASCII Code.


Anmelden zum Antworten