[PHP / MySQL] Scriptoptimierung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP / MySQL] Scriptoptimierung

    Hallo,

    es geht darum ein Teil meines Scriptes zu optimieren, da es extrem lange Laufzeiten hat. Es gibt bestimmt ein besserer Lösung nur fällt diese mir einfach nicht ein.

    Es gibt zwei Tabellen. Tabelle A wird regelmäßig ausgelesen und dann in Tabelle B zusammengafasst und wieder gelöscht.

    Also jetzt mal im Detail:

    Tabelle A:
    [ID] [A] [B]

    Tabelle B:
    [ID] [A] [B] [COUNT]

    So jetzt habe ich im Schnitt in der Tabelle A 5000 Einträge, von denen mehrer doppelt vorkommen.
    Ich möchte nun in Tabelle B eine Übersicht haben, welche Kombinationen vorkommen und wie oft. Es kommen bei jedem Durchgang ca. 1000 bis 2000 bekannt Kombinationen vor und der Rest sind neue. Daher hat Datenbank B dementsprechend viele Einträge. Hier meine momentane Lösung:

    PHP-Code:
    $abfrage mysql_query
    ("
       SELECT A, B, Count(A) 
          FROM Tabelle A 
          GROUP BY A, B
    "
    ) OR die(mysql_error());
    while(
    $row mysql_fetch_array($abfrage))
    {
       
    $abfrageb mysql_query
       
    ("
          SELECT ID 
             FROM Tabelle B 
             WHERE A = '
    $row[0]' AND B = '$row[1]'
       "
    );
        
    $rowb mysql_fetch_array($abfrageb);

        if(
    $rowb[0] != '')
        {
            
    mysql_query("
               UPDATE Tabelle B 
               SET COUNT = COUNT + '
    $row[2]
               WHERE (ID ='
    $rowb[0]')
           "
    ) OR die(mysql_error());
         }
         else
         {
             
    mysql_query("
                 INSERT INTO Tabelle B (A, B, COUNT) 
                 VALUES ('
    $row[0]', '$row[1]', '$row[2]')
            "
    ) OR die(mysql_error());
          }


  • #2
    Setze in der Tabelle B Unique-Keys und benutze insert... on duplicate key update.

    Noch viel besser wäre es aber, wenn du auf die Tabelle B komplett verzichtest, und die Informationen direkt aus Tabelle A abfragst wenn du sie benötigst.
    ich glaube

    Kommentar


    • #3
      Hm, da dieses dann später schneller abrufbar ist und auch so die Tabellengröße reduziert wird (es geht ja um pro Tag ca. 5000 Einträge die dadurch wegfallen) hätte ich es schon lieber so ;-)

      So nun noch eine verstädniss Frage:

      In der Anleitung heisst es:



      Wenn Sie ON DUPLICATE KEY UPDATE angeben und ein Datensatz eingefügt wird, der einen doppelten Wert in einem eindeutigen Index oder einem Primärschlüssel erzeugen würde, dann wird für den alten Datensatz UPDATE ausgeführt. Angenommen, die Spalte a wird als UNIQUE deklariert und enthält den Wert 1; in diesem Fall hätten die beiden folgenden Anweisungen dieselbe Wirkung:
      Also weder Spalte A noch Spalte B sind Uniqu oder Index, das ist ja die ID Spalte, geht das dann trotzdem?

      Kommentar


      • #4
        Original geschrieben von Laire
        Hm, da dieses dann später schneller abrufbar ist und auch so die Tabellengröße reduziert wird (es geht ja um pro Tag ca. 5000 Einträge die dadurch wegfallen) hätte ich es schon lieber so ;-)
        Das heißt du leerst Tabelle A anschließend? Wieso machst du dann überhaupt erst die Einträge und zählst nicht direkt die Kombinationen mit?
        Also weder Spalte A noch Spalte B sind Uniqu oder Index, das ist ja die ID Spalte, geht das dann trotzdem?
        Du musst halt einen Unique-Index über die Spaltenkombi A und B anlegen.
        ich glaube

        Kommentar


        • #5
          Original geschrieben von ministry
          Das heißt du leerst Tabelle A anschließend? Wieso machst du dann überhaupt erst die Einträge und zählst nicht direkt die Kombinationen mit?
          Du musst halt einen Unique-Index über die Spaltenkombi A und B anlegen.

          Es gibt noch weitere Spalten die wo anders ausgewertet werden...

          Hm, da kommen wir in Bereiche in denen ich noch nie war ;-)

          Wie wie gebe ich ein Unique über eine Spalten Kombi ?

          Kommentar


          • #6
            unique ( A, B )


            Btw: Ich würde die Queries aus der Schleife herausnehmen. Vor allem die Inserts kannst du zu einer Query zusammenfassen.
            Zuletzt geändert von PHP-Desaster; 20.01.2008, 15:20.

            Kommentar


            • #7
              Hm, und warum bekomme ich dann auf folgendes ne Fehlermedlung:

              ALTER TABLE t1_cod4_nick CHANGE unique ( nick_key, nick_nick );

              Kommentar


              • #8
                nicht CHANGE UNIQUE sondern ADD UNIQUE.
                ich glaube

                Kommentar


                • #9
                  Schon mal vielen dank für die hilfreichen Tipps.

                  Achja, wenn ich bei Insert mit mehreren Valeus arbeite, muss ich dann hinter jedem das ON DUPLICATE KEY UPDATE schreiben oder nur einmal ganz am Schluss?

                  Kommentar


                  • #10
                    Achja, wenn ich bei Insert mit mehreren Valeus arbeite, muss ich dann hinter jedem das ON DUPLICATE KEY UPDATE schreiben oder nur einmal ganz am Schluss?
                    Nur ein mal.
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar

                    Lädt...
                    X