Abfrage in MySQL dauert ewig

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

  • Abfrage in MySQL dauert ewig

    Hallo zusammen,
    ich habe nun auf nem P4 einen Apache und die neue MySQL aufgesetzt.

    Ich habe darauf nun einer Art "Quiz-Beabrietungsseite" laufen, wo man auch doppelte Fragen finden/löschen kann. Soweit vorab.

    Diese Doubletten-Suche hatte ich mir vorgestellt, dass er den ersten Datensatz nimmt und dann die DB mit like '%%$Frage%%' nach ähnlichen Fragen durchsucht. Funktioniert auch.

    Die Datenbank hat aber inzwischen fast 28.000 Fragen und nun dauert eine Suche nach 100 (als Maxwert/Seite) Doubletten in 28.000 ungefähr eine halbe Minute und die Prozessorlast hängt dabei auf 100%. Jemand ne Idee?

    Hier mal ein Teil aus dem Code:

    PHP-Code:
    $res = @mysql_query("select * FROM $table ORDER BY Frage DESC LIMIT $now$ppp");
          while (
    $reihe mysql_fetch_array($resMYSQL_ASSOC))
          {        
            
    $result mysql_query("SELECT * FROM $table WHERE Frage like '%%$reihe[Frage]%%' AND id!='$reihe[ID]' AND Antwort!='reihe[Antwort]'");
            while (
    $row mysql_fetch_array($resultMYSQL_ASSOC)) {
    // ab hier wird dann eine Tabelle gefüllt, wenn Doubletten vorhanden sind. 
    Danke für Eure Hilfe und einen schönen Abend

    Gruß,
    SKB
    ... wer nicht mit der Zeit geht, geht mit der Zeit ...

  • #2
    die lange dauer und belastung liegt eben an der enormen datenmenge... wie wäre es die suche dynamisch nach anzahl der datensätze zu splitten?
    Webdesign und Webentwicklung - Plunix.de

    Kommentar


    • #3
      Naja, splitten wäre keine sogute Möglichkeit, denn ich will ja wissen, ob in allen Datensätze Ähnlichkeiten bzw Doubletten vorhanden sind. Kann man denn eigentlich in MySQL einstellen, dass er von selbst die Abfrage etwas langsamer machen soll, so, dass ich dann auch mit ner anderen Anwendung ohne Probs auf den Server zugreifen kann?

      Gruß,
      SKB
      ... wer nicht mit der Zeit geht, geht mit der Zeit ...

      Kommentar


      • #4
        Zuerst bitte richtiges Trennen von Strings (und Arrayindizes) lesen.

        Um die Datenbank zu optimieren könntest du Indizes Anlegen, noch sinnvoller wäre es allerdings die Datenbankstruktur vernünftig zu normalisieren, dass heißt eine neue Tabelle anzulegen in der die Fragen stehen und dazu eine Tabelle mit den Antworten und der Id der Frage - so kannst du schnell sehen zu welcher Frage es mehrere Antworten gibt. Außerdem ist es nicht unbedingt sinnvoll für alle Fragen eine extra Abfrage durchzuführen.
        wie wäre es die suche dynamisch nach anzahl der datensätze zu splitten?
        Er begrenzt die Suche doch schon auf 100 Datensätze. 28000 Querys die jeweils 28000 Datensätze mit LIKE durchsuchen würde noch einiges länger dauern.
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          SELECT a.*, b.* FROM $table as a inner join $table as b on b.id< >a.id AND b.Frage like concat('%',a.Frage,'%')
          Slava
          bituniverse.com

          Kommentar


          • #6
            @ Slava.

            Ich denke mal, ich ersetze meine SELECT Anweisungen einfach mit deinen?
            ... wer nicht mit der Zeit geht, geht mit der Zeit ...

            Kommentar


            • #7
              Ich denke mal, ich ersetze meine SELECT Anweisungen einfach mit deinen?
              Nein. Du denkst nach, merkst das Slava eine Query über zwei Tabellen geschrieben hat, ließt nochmal meinen Beitrag und überlegst du wie du die Vorschläge sinnvoll umsetzen kannst statt einfach etwas zu kopieren.
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #8
                auch eine optimierte query kann nichts bringen, wenn die tabelle für ein query nicht optimiert ist.
                ich weis genau, dass du richtige Indexen machen muss, und zwar bei allen feldern die in ON, WHERE und ORDER BY stehen. Ohne kleinigkeiten zu wissen, kann ich nicht direkt sagen, ob dein feld 'Frage' als einfache oder full text Index gemacht werden muss.
                bei full text Index muss natürlcih die abfrage anderes angepasst werden.
                Also kann ich in moment nur empfehlen (wie tontechniker schon gesagt hat) sich mit Indexen zu beschäftigen.
                Slava
                bituniverse.com

                Kommentar

                Lädt...
                X