MySQL Abfrage. 136 Abfragen in 20 Sekunden normal?

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

  • #16
    kein plan, was du da versuchst. aber was spricht dagegen, ein array

    $trans[>>ID<<] = >>WORD<<;

    zu erstellen???

    Kommentar


    • #17
      Original geschrieben von TobiaZ
      kein plan, was du da versuchst. aber was spricht dagegen, ein array

      $trans[>>ID<<] = >>WORD<<;

      zu erstellen???
      Sorry .. spanische Hitze ggg

      Du meinst

      while ... {

      $wort[$list["TextID"]] = $list["TextLang"];
      }

      ?!?!

      PS: Klasse wie schnell ihr antwortet
      90% Prozent des Problems sitzen vorm PC

      Kommentar


      • #18
        Haste Siesta verpennt, oder wie???

        Probier mal aus, ob ich das meinen könnte

        Kommentar


        • #19
          Bei jedem Aufruf der Funtkion getWithID($id) prüfen, ob $trans[$id] einen Wert enthält.

          Ja: Wert zurückgeben
          Nein: Alle Wörter der Sprache aus der DB holen, in Array speichern ($trans[id] = wort) und $trans[$id] zurückgeben.

          Damit gibts nur eine DB-Anfrage beim 1. Aufruf der Funktion.

          Kommentar


          • #20
            Alle Wörter der Sprache aus der DB holen,
            Kann u.U. den Speicher recht voll machen!

            Kommentar


            • #21
              Man könnte auch am Anfang der Seite einen Array setzen, in dem Die jeweiligen IDs, die für das Skript gebraucht werden abgesetzt sind und dann diese abfragen, so spart man Speicher ...

              Noch günstiger ist es nicht Wörter sondern Phrasen zu verwenden,
              und noch günstiger ist es XML für Lokalisierungen zu verwenden, ( die XML evtl aus Datenbanken genieren, und durch professionelle Übersetzer 'lokalisieren' lassen )

              oder eingebaute Lokalisierungsfunktionen zu verwenden ...

              aber als Ansatz:
              PHP-Code:
               ....
              // Du weißt welche Werte benötigt werden 
              $IDsNeeded = array(1,3,6,12,56,23 .... ) ;

              $lcl localise($IDsNeeded,$session->language(),$db);
              ...
              print 
              $lcl[1];
              ....

              print 
              $lcl[12]; 
              und dann noch die Funktion
              PHP-Code:
              function localize($array,$language,&$dbo) {
                 
              $sql "SELECT id, phrase FROM table WHERE lang = '".mysql_real_escape_string($language). "' AND id IN (".implode(',',$array).")";
              $result $dbo->query($sql);
              $lcl=array();
              while (
              $row $result->fetch())
                  
              $lcl[$row['id']] = $row['phrase'];
              }
              return
              $lcl
              chansel0049
              ----------------------------------------------------
              if you've reached the bottomline - dig further!
              Übersetzer gesucht? http://www.babelport.com

              Kommentar


              • #22
                Boah, danke Leuts!

                Bei XML kenn ich mich absolut nicht aus, aber ich werds im Hinterkopf behalten!!!

                Also gut .. ich hab mich mal für die Methode "Hol alle Texte mit den IDs dieser Seite" entschieden. Nun steh ich aber vor einem anderen Problem. Wollte aber kein extra Topic dafür aufmachen, weils ja noch hier dazu gehört.

                Bestehende Struktur ist:

                Viele HTML-Seiten die via $text->getWithID(TEXTID) auf die Klasse Text() zugreifen, die dann pro Wort einen SELECT Aufruf startet.

                Das will ich ändern, aber möglichst unkompliziert und mit möglichst wenig Zeitaufwand, wenn das möglich ist.

                Idee1:
                Ich kenne ja alle IDs bereits. Also am Anfang String zusammenbasteln, alle abfragen und via Arrays an die entsprechenden Stellen einsetzen. Vorteil: 1 Abfrage. Nachteil: Ich muss alle PHP-Dateien bearbeiten.

                Idee2:
                Änderung in der Klasse, damit ich möglichste alle HTML-Seiten (=PHP Seiten) gleichzeitig ansprechen kann. Dabei sammeln aller IDs und über die Klasse query zusammenbasteln.
                vorteil: Ist zentraler. Nachteil: Auch wenn nur Hinzufügen einer "GO"-Funktion am Ende jeder PHP-Datei, ich muss leider immer noch jede PHPDatei bearbeiten. Weitere Nachteil: 2 Durchläufe der PHP/HTML Seite, da erst sammeln und dann einpflanzen.

                Ich tendiere zu 1. Viel aufwand für mich, aber letzlich soll ja der Besucher schnellstmöglich Service erhalten.

                Was haltet ihr davon? weitere Ideen?! Bin für alles offen und dankbar. Danke auch schon für die Beteiligung. Helft mir echt weiter!
                90% Prozent des Problems sitzen vorm PC

                Kommentar


                • #23
                  Quatsch,

                  Ändere die Klasse und lad die Werte im Konstruktor in einen Array in die Klasse und ändere die Funktion $klasse->getText ... damit die auf den Array zugreift, dann muß nicht mal ne Funktion hinzukommen,

                  Du kannst anfangs alle Werte laden, und per 'logging' eine Woche oder so herausfinden welche Werte aus welcher Datei abgefragt werden und dann über ein Join und WHERE die Zeilen fürs Array Seitenspezifisch laden ...
                  chansel0049
                  ----------------------------------------------------
                  if you've reached the bottomline - dig further!
                  Übersetzer gesucht? http://www.babelport.com

                  Kommentar


                  • #24
                    Quatsch is das nicht wirklich ..

                    Die Datenbank hat über 11000 Einträge in einer Grösse von etwa 1MB. jetzt alles in einem Array zu speichern .. suboptimal. Rauszufiltern welche Texte benötigt werden .. schier unmöglich .. Und jede Seite hat andere IDs. Kann es also nicht statisch machen.

                    Wie funktioniert das mit dem Logging? das hört sich interessant an.
                    90% Prozent des Problems sitzen vorm PC

                    Kommentar


                    • #25
                      Das Logging kann per DB - INSERT oder fwrite gemacht werden ...

                      Bei 11000 Einträgen, zählt das Argument natürlich ...

                      Aber : sind das 11000 Worte oder Sätze ?
                      chansel0049
                      ----------------------------------------------------
                      if you've reached the bottomline - dig further!
                      Übersetzer gesucht? http://www.babelport.com

                      Kommentar


                      • #26
                        Also es sind eher Textbausteine als Worte. Klar, für die Menüführung sind es meist nur Worte, aber es befinden sich genauso ganze Textpassagen in der entsprechenden Sprache in der Datenbank.

                        Sorry wenn ich grad auf dem Schlauch stehe, aber ich kann mir nicht vorstellen wie das mit dem INSERT / fwrite funktionieren soll.

                        Die einzige Art logging die ich gemacht habe war, dass pro SQL-Abfrage eben diese Abfrage in eine spezielle Tabelle "tracking" gespeichert habe. Eben durch auslesen dieser Trackingtabelle konnte ich erfahren, dass alleine die Startseite 136 Aufrufe hat, für die ich an die 20 Sekunden brauche. Weiss auch welche Aufrufe und von welcher Datei. Aber ich denke nicht, dass du das an logging gemeint hast.

                        Wenn du Zeit und Lust hast mir das zu erklären, danke! Alles was die Seite schneller machen kann wird mit offenen Armen empfangen .. sowie die empfehlenden :-) du brauchst nicht zufällig Erfahrungen in Spanien, oder? ;-
                        90% Prozent des Problems sitzen vorm PC

                        Kommentar


                        • #27
                          Erstelle in deiner Datenbank eine Tabelle LogTxtPerPage

                          id (auto) | seite (varchar) | textid

                          und füge in deine Klassen Funktion so etwas ein wie
                          PHP-Code:
                          function getWithID($TEXTID) {
                           ....
                          // Logging  
                             
                          if (DOLOGTEXTID) {
                                  
                          $sql "INSERT INTO LogTxtPerPage SET 
                                              seite = '"
                          .mysql_real_escape_string($_SERVER['SCRIPT_FILENAME'])."',
                                              textid = '"
                          .$TEXTID;
                             }
                          ...

                          Damit 'loggst ' du eine Gewisse Zeit alle TEXTIDs mit entsprechendem Seitennamen (Um die Zeit zu beschleunigen kannst Du dich einmal quer durch klicken) bis alle Seiten mindestens einmal aufgerufen wurden ... (Oder du nimmst einen Offline Browser wie WinHTTrack und lädst einmal alles komplett runter)

                          Dabei werden zwar die Tabellenzeilen sicher redundant aber dass lässt sich schnell beheben

                          danach hast Du in der Tabelle alle Einträge die Du brauchst und kannst Das Logging wieder rausnehmen ...

                          Wenn Die Tabelle dann etwas von redundanten Einträgen gesäubert wurde (BSP SELECT DISTINCT seite, textid ... TRUNCATE TABLE ... INSERT ...)

                          Kannst du Dann im Konstruktor der Klasse mit einer einzigen Abfrage per JOIN oder Subselects seitenspezisch deine Textphrasen laden
                          chansel0049
                          ----------------------------------------------------
                          if you've reached the bottomline - dig further!
                          Übersetzer gesucht? http://www.babelport.com

                          Kommentar

                          Lädt...
                          X