Serverlast durch MYSQL?

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

  • Serverlast durch MYSQL?

    Hallo Leutz,

    meine Website ist gerade wegen zu hoher Serverlast von einem Shared Server auf einen isolierten Notfallserver transferiert worden. Angeblich ist meine Webseite Verursacher von Störungen durch Serverüberlastung.

    Ich habe pro Seite recht viele MySQL Abfragen, oft auch exakt identische mit identischen Ergebnissen, z. B. wird ein Kategoriename per PHP aus der Datenbank ausgelesen und öfter auf der Seite per PHP Variable eingesetzt.

    Meine Frage nun: Wenn ich diese PHP Variable verwende, wird dann jedes Mal wieder eine neue MySQL Abfrage gestartet, oder ist die irgendwo gecached? Geht das irgendwie? Würde die Serverlast bestimmt schonmal reduzieren, wenn die Abfrage nur 1x stattfände und dann das Ergebnis auf der ganzen Seite mehrfach zu Verfügung stände.

    Dank vorab,
    Jochen

    PS: MySQL Query Cache ist schon aktiviert.

  • #2
    Re: Serverlast durch MYSQL?

    Ich habe pro Seite recht viele MySQL Abfragen, oft auch exakt identische mit identischen Ergebnissen, z. B. wird ein Kategoriename per PHP aus der Datenbank ausgelesen und öfter auf der Seite per PHP Variable eingesetzt.
    Holst du dir die Daten einmal in eine Variable und ließt nur noch diese oder stellst du die Anfrage wirklich öfters? Zweiteres ist natürlich totaler Mist.

    Kommentar


    • #3
      Ich glaube er meint ob bei jedem Ausgeben von $irgendein_feld wieder irgedneine Interaktion mit der Datenbank geschieht. Nein.

      Wenn du erstmal den Query abgeschickt hast, arbeitest du mit Sicherheit nur noch mit dem Result Pointer. Das ist dann keine Datenbankinteraktion mehr.

      Kommentar


      • #4
        Genauso meine ich es. Also ich mach ne query, hol den array und speicher das in $variable. Dann wird also nciht jedes Mal, wenn ich $variable verwende, wieder die Datenbankabfrage gemacht, sondern das irgendwie lokal geladen?

        Gibts noch irgendwelche Tricks und Kniffe zur Reduzierung der Serverlast?

        Schöne Grüße
        Zuletzt geändert von Kabbelwasser; 12.12.2008, 15:25.

        Kommentar


        • #5
          Original geschrieben von Kabbelwasser
          Genauso meine ich es. Also ich mach ne query, hol den array und speicher das in $variable. Dann wird also nciht jedes Mal, wenn ich $variable verwende, wieder die Datenbankabfrage gemacht, sondern das irgendwie lokal geladen?
          Die Kurzform: Es wird einmal geladen und du weist es anderen Strings zu auf die du dann später zugreifst.

          Original geschrieben von Kabbelwasser
          Gibts noch irgendwelche Tricks und Kniffe zur Reduzierung der Serverlast?
          Am meisten lässt sich da wohl über Optimierung der Queries machen. Was läuft denn da? Poste doch mal ein paar Queries von denen du vermutest, dass sie viel Last erzeugen.

          Kommentar


          • #6
            Hallo,

            ist ne contrib für Oscommerce, mit der ich u.a. Meta Tags erstelle:

            [PHP]$metaQuery = "SELECT `products_description`.`products_name`, `categories_description`.`categories_name`, `manufacturers`.`manufacturers_name` ";
            $metaQuery .= "FROM products, products_description, products_to_categories, categories, categories_description, languages, manufacturers, configuration ";
            $metaQuery .= "WHERE products.products_id = products_description.products_id ";
            $metaQuery .= "AND products_description.language_id = languages.languages_id ";
            $metaQuery .= "AND products_description.products_id = products_to_categories.products_id ";
            $metaQuery .= "AND products_to_categories.categories_id = categories.categories_id ";
            $metaQuery .= "AND categories.categories_id = categories_description.categories_id ";
            $metaQuery .= "AND categories_description.language_id = languages.languages_id ";
            $metaQuery .= "AND products.manufacturers_id = manufacturers.manufacturers_id ";
            $metaQuery .= "AND products.products_status = 1 ";
            // $metaQuery .= "AND configuration.configuration_key = 'DEFAULT_LANGUAGE' ";
            $metaQuery .= "AND languages.code = configuration.configuration_value ";[PHP]

            und dann gehts noch spezifischer weiter für Extra-Abfragen:


            PHP-Code:
            $metaQuery .= "AND manufacturers.manufacturers_id = '" $metaManufacturersId "' "
            Eigentlich Standard-0-8-15 oder? Mir fällt nichts zum Optimieren mehr ein.

            Kommentar


            • #7
              Hi,

              1. Bitte brich deinen Code um, ich muss horiontal scrollen!


              soweit ich weiß, sind Abfragen, die nicht mit INNER JOIN arbeiten und mehrere Tabellen verwenden generell langsamer als Abfragen mit INNER JOIN.

              Des Weiteren (und zu Zwecken der Übersichtlichkeit) kannst du Tabellennamen ebenfalls "umbenennen", wie ein Feld: timestamp AS date,...

              Die einfachen Hochkommas für die Spaltennamen brauchst du in der Regel auch nicht. Verbessert mich, aber sind die nicht dafür da, falls ein Leerzeichen drinn vorkommt (was in einer gescheiten Benennung sowieso nicht der Fall ist)?

              Also: SELECT pd.products_name, ... FROM products_description AS pd, ...

              Und dann natürlich noch die Optimierung mit INNER JOIN, wodurch direkt nur die Datensätze von anderen Tabellen überprüft werden, die das Kriterium in ON erfüllen.
              Bsp.: ... FROM products p INNER JOIN products_descriptions pd ON pd.product_id = p.id ...


              gruß
              lsgdcity

              Kommentar


              • #8
                Poste mal das Ergebnis der Abfrage
                EXPLAIN <deine-Select-Query>

                Kommentar


                • #9


                  Hier die Ausgabe:


                  6 Tabellen sind beteiligt:

                  1. products_description
                  2. products
                  3. languages
                  4. categories
                  5. products_to_categories
                  6. manufacturers

                  Frag mich nicht, warum so kompliziert - ist von Oscommerce so vorgegeben.

                  Schnittmenge in allen Tabellen ist immer die products_id

                  So, ich möchte jetzt auf allen möglichen Seiten dynamische Texte passend zu einem Produkt erstellen, in denen Kategoriename, Produktname, Hersteller, ... drin vorkommen - und das 6-sprachig.

                  Beispiel:
                  Fragen zum Produkt <products_name aus products where sprache=vom browser erkannte language> aus dem Hause <Hersteller>? Wir helfen gerne! Verwenden Sie unser Kontaktformular für Fragen zum sowie weitere <Kategorie des Geräts in der jeweiligen Sprache> bla bla.

                  Also was ich brauche ist:
                  1. gib mir Feld short_desc aus products_description in der passenden Sprache, wo products_id in beiden gleich ist
                  2. suche in products_to_categories die categories_id, die für meine products_id hinterlegt ist und gib für die categories_id aus der Tabelle categories den passenden Kategorienamen in der richtigen Sprache
                  3. such mir manufacturers_name aus der Tabelle manufacturers wo manufacturers_id mit der manufacturers_id in der Tabelle products übereinstimmt

                  Um die query immer an den jeweiligen Zweck anpassen zu können und nicht alles immer neu schreiben zu müssen, hab ich die halt zerstückelt und kann die passenden SQL Abfragen da rausziehen.

                  Diese Datei steht dann auf jeder Seite zu Verfügung, und die Variablen können verwendet werden.

                  Das Ganze ist fertig und funktioniert, ich suche wie gesagt nur noch nach einem Weg, um die Ressourcenauslastung des Servers zu reduzieren.

                  Gut erklärt? Oder was soll ich schreiben? Soll ich noch die Tabellenstruktur erklären?

                  Und inner join Abfragen sind ressourcenschonender, sagt ihr?
                  Zuletzt geändert von Kabbelwasser; 14.12.2008, 14:59.

                  Kommentar


                  • #10
                    Original geschrieben von Kabbelwasser
                    Gut erklärt? Oder was soll ich schreiben?
                    Aber ich glaube, Du solltest es von MySQL erklären lassen:

                    EXPLAIN-Syntax (Informationen über ein SELECT erhalten)

                    Kommentar


                    • #11
                      Bevor du jetzt riesig an den Datenbanken rumschraubst: Bist Du denn wirklich sicher, daß mySQL die Auslastung verursacht? Was sagt dein Provider dazu? Wenn er sehen kann, daß dein Paket seinen Server überlastet, kann er auch sehen, welche Komponente bzw. welcher Service.

                      Kommentar


                      • #12
                        Hehe, ok, falsch verstanden.

                        Hier das Ergebnis der Abfrage

                        PHP-Code:
                         EXPLAIN (
                        SELECT `products_description`.`products_name` , `categories_description`.`categories_name` , `manufacturers`.`manufacturers_name
                        FROM productsproducts_descriptionproducts_to_categoriescategoriescategories_descriptionlanguagesmanufacturersconfiguration
                        WHERE products
                        .products_id products_description.products_id
                        AND products_description.language_id languages.languages_id
                        AND products_description.products_id products_to_categories.products_id
                        AND products_to_categories.categories_id categories.categories_id
                        AND categories.categories_id categories_description.categories_id
                        AND categories_description.language_id languages.languages_id
                        AND products.manufacturers_id manufacturers.manufacturers_id
                        AND products.products_status =1
                        AND languages.code configuration.configuration_value

                        :


                        PHP-Code:
                        id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
                        1 SIMPLE languages ALL PRIMARY NULL NULL NULL 6   
                        1 SIMPLE products_to_categories index PRIMARY PRIMARY 8 NULL 978 Using index 
                        1 SIMPLE categories eq_ref PRIMARY PRIMARY 4 d0049d94
                        .products_to_categories.categories_id 1 Using index 
                        1 SIMPLE configuration ALL NULL NULL NULL NULL 418 Using where 
                        1 SIMPLE categories_description eq_ref PRIMARY PRIMARY 8 d0049d94
                        .products_to_categories.categories_id,d004... 1   
                        1 SIMPLE products eq_ref PRIMARY
                        ,manufacturers_id,products_status PRIMARY 4 d0049d94.products_to_categories.products_id 1 Using where 
                        1 SIMPLE manufacturers eq_ref PRIMARY PRIMARY 4 d0049d94
                        .products.manufacturers_id 1   
                        1 SIMPLE products_description eq_ref PRIMARY PRIMARY 8 d0049d94
                        .products.products_id,d0049d94.languages.l... 1 Using where 
                        Der Provider sagt, dass die Zahl der Mysql Abfragen pro Click (also pro Besucher) zu hoch sind, aber genaueres kann er mir auch nicht sagen.

                        Kommentar


                        • #13
                          wird bei einem query die mysql-verbindung geöffnen und danach wieder geschlossen???
                          Gruß
                          Uzu

                          private Homepage

                          Kommentar


                          • #14
                            Original geschrieben von Kabbelwasser
                            Der Provider sagt, dass die Zahl der Mysql Abfragen pro Click (also pro Besucher) zu hoch sind, aber genaueres kann er mir auch nicht sagen.
                            Identifiziere/logge mal alle Queries eines Requests und dann schau, ob wirklich alle ausgeführt werden müssen und ob welche mehrmals ausgeführt werden.

                            Kommentar


                            • #15
                              Ähm, bin Anfänger - wie geht das?

                              Kommentar

                              Lädt...
                              X