Forum - MySql optimieren

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

  • Forum - MySql optimieren

    Ich habe ein selbstgeschriebenes Forum das zur Zeit mit ca 20000 Beiträgen, 1500 Themen und 2000 Benutzern umgehen muss.

    Die Performance ist ok, könnte aber besser sein... die sql abfrage um 15 themen eines Boards auszulesen dauert laut phpmyadmin im schnitt 0.0096 sek. Ansich ist das wenig, der aufruf der Seite dauert trotzdem so seine Zeit, was aber nicht durch andere qrys verursacht wird.

    Meine Frage: Gibt es spezielle Tips und Kniffe um so etwas schneller zu machen?

    LG Chris

  • #2
    0,0096 Sekunden von einer Gesamtlaufzeit von wieviel Sekunden?

    Wenn es nicht mehr Abfragen gibt, der Aufbau der Seite "aber so seine Zeit" braucht, warum schiebst du's dann auf mySQL?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Es ist ja auch die Frage was du im Code generell machst... und wie du deine Queries optimierst etc.....

      Wenn die Query 0,0096s braucht und es keine weiteren Queries gibt is dsa hier doch auch ohnehin kein SQL-Problem, oder?
      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
      var_dump(), print_r(), debug_backtrace und echo.
      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

      Kommentar


      • #4
        doch, es gibt noch eine abfrage: "SELECT COUNT(id) AS myposts FROM posts WHERE thread_id=$row->id AND user_id='".$_COOKIE['user_id']."'"

        undzwar in der while schleife... unschön aber wenn es mit ihm schleifen-query ist, dauert es noch länger...

        Danke für die superschnellen antworten

        LG Chris

        An dem restlichen Script wirds nicht liegen und der Server ist jetzt auch nicht langsam oder so :/

        Kommentar


        • #5
          Und deine Messungen, wie lang diese Abfrage insgesamt braucht, hat was ergeben?

          Warum zählst du denn überhaupt in der Schleife?
          Warum nicht
          Code:
          SELECT
            thread_id, user_id,
            COUNT(id) myposts
          FROM posts
          GROUP BY
            thread_id, user_id
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Weil es dann noch viel länger dauert, sage und schreibe 26 sekunden

            PHP-Code:
               SELECT
                    t
            .*,
                    
            u.nickname
                    
            COUNT(p.idmyposts 
                FROM
                    threads t
                JOIN
                    user u ON u
            .id=t.l_user
                    LEFT JOIN posts p ON p
            .thread_id=t.id AND p.user_id=1
                WHERE
                    board_id
            ='5'
                
            GROUP BY t.id
                ORDER BY t
            .sticky DESC,t.l_time DESC LIMIT 15 
            das wäre der query wenn ich das COUNT aus der while schleife nehme um das gleich ergebnis zu kriegen... dieser query dauert 26 sekunden... wenn ich ihn in der while schleife habe gehts mit ca einer sekunde...

            jedenfalls liegt da schonmal das problem...

            P.S.: Das ganze soll prüfen ob der benutzer schon in einem Thema gepostet hat oder nicht...

            LG Chris

            Kommentar


            • #7
              Lass mal ein EXPLAIN drüber laufen ... und check mal die Indizes ... !
              carpe noctem

              [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
              [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

              Kommentar


              • #8
                das sagt mir jetzt nicht viel, ich werde mal googlen

                aber ich kanns schon verstehen, der muss 15 mal 20000 beiträge durchsuchen... das dauert, jedenfalls in meiner vorstellung

                EDIT:


                sagt mir jetzt nichts, vlt hilfts euch weiter
                Zuletzt geändert von stf]Daywalker; 14.07.2005, 15:22.

                Kommentar


                • #9
                  Nimm deine Abfrage und füge sie in phpmyadmin ein, schreibe EXPLAIN vornedran und führe sie dann aus

                  Wie kommst du auf 15 mal 20000 Einträge?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Setz mal einen Index auf jede verwendete Spalte

                    Wo kommen eigentlich die beiden zusätzlichen Tabellen her?
                    In deinem Select in der while-Schleife steht die doch auch nicht drin
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      habs oben reineditiert

                      weil er ja bei jedem thread der eingelesen wird nachschauen muss, ob in der post DB beiträge von mir sind... so denke ich mir das jedenfalls...

                      Edit: was bewirkt ein index?

                      Habe jetzt ein Index auf user_id und einen auf thread_id in der post tabelle gesetzt, jetzt gehts ziemlich fix... woran liegt das?
                      Zuletzt geändert von stf]Daywalker; 14.07.2005, 15:29.

                      Kommentar


                      • #12
                        Wenn man es richtig macht, werden SELECTs schnelle und und leider INSERTs langsamer. NIEMALS an einem live System Indizies setzten! Frag B*** der hat schon ganze Server damit abgeschossen
                        h.a.n.d.
                        Schmalle

                        http://impressed.by
                        http://blog.schmalenberger.it



                        Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                        ... nur ohne :-)

                        Kommentar


                        • #13
                          habs jetzt am live system gemacht und merke gar kein unterschied bei den inserts, geht eher schneller so habe ich das gefühl....

                          was gibts da noch für nachteile?

                          Kommentar


                          • #14
                            Dem Guten sollte mal einer sagen, dass man nicht jede Spalte einzeln indizieren sollte...

                            @stf]Daywalker
                            Stell dir vor, du hast einen Schrank voll mit Blättern und sollst jetzt die Blätter zählen, die im Juni 2005 gedruckt wurden (Tagesdatum steht auf dem Blatt). Bei 20.000 Blättern wünschst du dir da mit Sicherheit 1 - 15 Azubis...

                            Wenn du jetzt aber einen Schrank hättest, wo die Blätter schon monatsweise in Schubladen abgelegt wären, würdest du dich freuen, richtig?
                            Richtig, du musst ja schließlich nicht mehr alle Blätter anschauen, sondern nur die in genau einer Schublade.

                            So in etwa ist das mit dem Index auch.


                            Dummerweise dauert das Suchen der richigen Schublade (und evtl. Schnellheftern, ... in der Schublade) länger, als das Blatt einfach in den Schrank zu schmeißen => INSERTs werden evtl. lansgamer, da der Overhead zum Verwalten der Indizes größer wird
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              danke für die Supererklärung und die schnelle Hilfe

                              LG Chris

                              Kommentar

                              Lädt...
                              X