Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Select über zwei Tabellen / Performanceproblem

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Select über zwei Tabellen / Performanceproblem

    Ich habe ein Performanceproblem und bin mir sicher, dass es hausgemacht ist, weiß aber nicht, wo ich ansetzen soll.

    tab1: (ca. 300.000 Zeilen)

    id int(10)
    feld1 varchar (30)
    sperre set 'ok,gesperrt'
    (weitere 10 Felder)

    Primary Key ist id, auf feld1 liegt ein Index.


    tab2: (ca 1000 Zeilen)

    feld2 varchar (30)

    Index liegt auf feld2


    Feld2 enthält solche Daten:
    %text1%
    %text2%
    usw.

    Die Aufgabe besteht darin, alle Zeilen in tab als 'gesperrt' zu markieren, wenn tab1.feld1 LIKE tab2.feld2 ist.

    Ich kann nur mit phpmyadmin umgehen und habe dort folgenden SQL-Befehl eingegeben:

    PHP-Code:
    SELECT FROM tab1,tab2 WHERE feld1 LIKE feld2
    mit der Idee, erstmal zu schaun ob es eine Treffermenge gibt, und dann das Statement so abzuändern:

    PHP-Code:
    UPDATE tab1,tab2 SET sperre='gesperrt' WHERE feld1 LIKE feld2
    Bis zum Update kam ich allerdings nicht mehr, das Select-Statement habe ich nach 20 Min über die Taskliste gekillt.

    Wo habe ich den Murks eingebaut?
    PHP-Code:
    if ($var != 0) {
      
    $var 0;



  • #2
    Code:
    UPDATE `tab1`, `tab2` SET `tab1`.`sperre` = 'gesperrt' WHERE `tab1`.`feild1` LIKE `tab2`.`field2`
    Das sollte es eigentlich machen
    sigpic

    Kommentar


    • #3
      Danke für die Antwort.

      Du hast zu meinem UPDATE eigentlich nur die Häkchen hinzugefügt, bringt das den erhofften Geschwindigkeitszuwachs?

      Ich bin bei komplexen Updates immer so vorgegangen, dass ich die WHERE-Klausel erstmal mit einem SELECT * geprüft habe, und dann das "SELECT * FROM" durch "UPDATE" ersetzt und die SET-Statements eingebaut habe.

      In diesem Fall findet das SELECT aber schon kein (schnelles) Ende, und ich will kein Update starten, das mit eine Woche lang den Server lahmlegt
      PHP-Code:
      if ($var != 0) {
        
      $var 0;

      Kommentar


      • #4
        Muß es zwingend LIKE sein? Meines Wissens ist das wesentlich lahmer als der normale '=' Operator. Die Backticks bringen wohl eher keine Performanceunterschiede...
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Zitat von nikosch77-new Beitrag anzeigen
          Die Backticks bringen wohl eher keine Performanceunterschiede...
          Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
          Gruss
          L

          Kommentar


          • #6
            Zitat von lazydog Beitrag anzeigen
            Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
            Also ich finde das ist wohl Ansichtssache und auch nur wenn ich eine Spalte `alter` nennen will, weil eben das Alter eines Dinges drin steht, dann programmiere ich ja nicht unsorgfältig.

            Kommentar


            • #7
              Ausserdem verleiten sie zu unsorgfältigem Programmieren und stören die Übersichtlichkeit.
              Die Aussage würde ich auch gern näher erklärt sehen. Was meint denn "unsorgfältigem Programmieren" in diesem Zusammenhang? Und was ist hier unübersichtlich:
              Code:
              UPDATE 
                `tab1` , 
                `tab2` 
              SET 
                `tab1`.`sperre` = 'gesperrt' 
              WHERE 
                `tab1`.`field1` LIKE `tab2`.`field2`
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Feld2 enthält solche Daten:
                %text1%
                %text2%
                usw.
                Dewegen habe ich ein LIKE in der WHERE-Klausel. Ich hab das ganze unsinnigerweise aber mal so laufen lassen:

                PHP-Code:
                SELECT FROM tab1,tab2 WHERE feld1 feld2
                Das dauert ca. 2 Min und bringt natürlich kein Ergebnis.

                Ein Bekannter, der allerdings auch nicht weiterhelfen konnte sagte mir, dass wohl alle Zeilen der einen Tabelle mit allen Zeilen der anderen Tabelle verknüpft würden und dann erst die Vergleichsbedingung geprüft würde. Das würde bei meinem SQL-Statement bedeuten, dass ich um die 30 Mio Zeilen bilde.

                Kann man das Ganze anders formulieren? Sonst bau ich mir per PHP eine Schleife durch alle Zeilen der kleinen Tabelle und such dann in der großen Tabelle rum - aber das kann ja nun wirklich nicht der Weisheit letzter Schluss sein.
                PHP-Code:
                if ($var != 0) {
                  
                $var 0;

                Kommentar


                • #9
                  guckst du im MySQL Manual unter JOIN und insbesondere der ON-Klausel

                  Kommentar


                  • #10
                    Zitat von nikosch77-new Beitrag anzeigen
                    Die Aussage würde ich auch gern näher erklärt sehen. Was meint denn "unsorgfältigem Programmieren" in diesem Zusammenhang? Und was ist hier unübersichtlich:
                    Code:
                    UPDATE 
                      `tab1` , 
                      `tab2` 
                    SET 
                      `tab1`.`sperre` = 'gesperrt' 
                    WHERE 
                      `tab1`.`field1` LIKE `tab2`.`field2`
                    Natürlich ist das teilweise Ansichtsache
                    Code:
                    UPDATE
                        tab1,
                        tab2
                    SET
                        tab1.sperre = 'gesperrt'
                    WHERE
                        tab1.field1 LIKE tab2.field2
                    finde ich auf jeden Fall übersichtlicher und es gibt keine Verwechslungsgefahr mit Anführungszeichen. Reservierte Wörter sollte man vermeiden. Wenn du Backticks verwendest, merkst du nicht einmal mehr, dass du reservierte Wörter brauchst. Ausserdem (auch wenn das wahrscheinlich für die meisten hier nicht wesentlich ist) ist es nicht portabel.
                    Gruss
                    L

                    Kommentar


                    • #11
                      Nenn mir doch mal einen Grund warum man reservierte Wörter vermeiden sollte, wenn man ausschließlich in PHP programmiert und die Backticks konsequent anwendet?

                      Kommentar


                      • #12
                        Code:
                        Alter
                        As
                        All
                        Cursor
                        Use / Set / Load / Read / Write
                        on / out
                        Return
                        Left / Right
                        Option / Release / Usage / Values
                        By / With / When / In
                        Range / Index
                        Um mal einige zu nennen. Mir fallen schon für den einen odere anderen Begriff Anwendungsfälle ein. Allen voran die, die im fremdsprachlichen Gbrauch andere Bedeutungen haben. PRO reservierte Wörter!
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Ich hab mir aus der großen Tabelle (A) mal 3000 Zeilen in eine andere Tabelle (B) kopiert.

                          Mit SELECT * FROM A,B WHERE A.feld = B.feld kriege ich die 3000 Ergebniszeilen in 0,4 Sekunden,

                          mit SELECT * FROM A INNER JOIN B ON A.feld = B.feld krieg ich das in der halben Zeit hin.

                          Wenn ich bei der INNER JOIN Variante aber ein LIKE setze, rödelt das Teil sich zu Tode. Ich denke, ich nudel die kleine Tabelle dann mal Zeile für Zeile mit einem PHP-Script durch und lass mir einen Verlaufszähler ausgeben.
                          PHP-Code:
                          if ($var != 0) {
                            
                          $var 0;

                          Kommentar


                          • #14
                            Zitat von Wolla Beitrag anzeigen
                            Feld2 enthält solche Daten:
                            %text1%
                            %text2%
                            usw.
                            Warum? Insbesondere: Wofür brauchst Du die %-Platzhalter? (ich weiss, was sie bei LIKE bewirken - wofür brauchst Du dieses Verhalten?)

                            Kommentar


                            • #15
                              Zitat von David Beitrag anzeigen
                              Warum? Insbesondere: Wofür brauchst Du die %-Platzhalter? (ich weiss, was sie bei LIKE bewirken - wofür brauchst Du dieses Verhalten?)
                              Ich kanns mir vorstellen mehrere Werte in einem Feld

                              Kommentar

                              Lädt...
                              X