MySQL Befehle optimieren / zu langsam

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

  • MySQL Befehle optimieren / zu langsam

    Hallo,

    meine Datenbankverbindungen sind nicht gerade schnell wie ich finde. Ich habe eine MySQL DB bei Puretec und nun zu meinen Fragen:

    - Ist es Schlimm wenn ich mit mysql_pconnect connecte, oder sollte man das p rauslassen, bringt das was in bezug auf geschwindigkeit? Bis jetzt habe ich immer nur pconnect. Noch ne Frage dazu: Wenn ich nur connect schreibe reicht das für das ganze PHP Script incl. Include Scripts oder muss man für jeden SQL Query einen neuen mysql_connect machen?

    - Ich beende die Verbindungen nie mit mysql_close(); - ist das schlimm oder was bringt es wenn man das macht?

    - Auch den mysql_free_result Befehl nutze ich nicht, sollte man das machen?

    Schreibt mir doch mal was das ganze bringt und wie man seine Befehle am besten optimiert, sodass die DB schnell läuft.

    DANKE

    Andi

  • #2
    Als erstes hilft natürlich, die Datenbank in eine Normalform zu bringen .

    1. Verbesserungen per Connect

    Ich benutze eigentlich immer mysql_pconnect, es kann Performance-verbesserungen bringen-hängt aber immer von den scripten und der DB selbst ab, da PHP bei einer erneuten Verbindungsanfrage immer prüft, ob bereits eine persistente verbindung geöffnet ist und diese dann benutzt.



    das mysql_close funktioniert auch nur in Verbindung mit mysql_connect...

    mysql_result ist immer langsamer als die alternativen Funktionen, welche den gesamten Datensatz liefern.

    2. Verbesserung durch geschickte Abfragen

    dann solltest du eigentlich nie SELECT * FROM nutzen, es sei denn , du benötigst alle Felder zur Ausgabe

    Das Indizieren von Tabellen ist ein sehr grosser Performance-Flaschenhals. Wenn es geht-auf Indizes verzichten.

    die Dimensionierung der einzelnen Felder:
    Die Abfragen werden deutlich schneller, wenn du Felder--bisher als int deklariert, jetzt als smallint unsigned oder tyinyint unsigned
    setzt.

    Bei Inserts immer:

    statt
    INSERT TO tabelle VALUES (...)

    jetzt INSERT INTO tabelle VALUES (...),(...) schreiben

    d.h. immer mehrere datensätze auf einmal einfügen



    Für das Einfügen grosser Datenmengen immer LOAD DATA INFILE
    benutzen .

    3. Verbesserungen durch besseren Webserver

    dann ist natürlich als wichtigster Faktor, die Performance der DB beim Hoster( ich glaube, die CT hatte in der letzten oder vorletzten ausgabe die mysql-geschwindigkeit einiger Hoster getestet)
    Ist schon ein Unterschied , ob ein Webserver Raid hat oder Nicht .

    Der Hauptspeicher bringt auch noch mal ein gewisses Plus an geschwindigkeit.

    Ich hoffe, ich habe net soo grossen Mist geschrieben

    P.S. wer sich intensiver Mit der Optimierung von MySql beschäftigen möchte Klick oder Deutsch
    Zuletzt geändert von array_hunter; 27.08.2002, 21:52.
    <Life>Traumprojekt-Die Design-Community</life>

    Kommentar


    • #3
      Danke für die Ratschläge!

      Bis auf einen beachte ich alle deine Ratschläge...
      Das mit den Feldergrößen ist bei mir so ne sache: Für die ID nehm ich z.B. grundsätzlich immer INT, ich nehme eigentlich für Zahlen immer INT, und bei Zeichenketten immer Varchar bzw. bei sehr großen Text.

      Kommentar


      • #4
        Original geschrieben von array_hunter
        Als erstes hilft natürlich, die Datenbank in eine Normalform zu bringen .

        1. Verbesserungen per Connect

        Ich benutze eigentlich immer mysql_pconnect, es kann Performance-verbesserungen bringen-hängt aber immer von den scripten und der DB selbst ab, da PHP bei einer erneuten Verbindungsanfrage immer prüft, ob bereits eine persistente verbindung geöffnet ist und diese dann benutzt.
        Wenn's mal so wäre ... dann wär's leben viel leichter ... !
        Es gibt keine Bessere Methode 'nen Datenbank die unter Vollast läuft zu killen als mit mysql_pconnect() ... die Prozesse bleiben ewig offen (was hohen Speicherbedarf bedeutet) ... und php rallt es nicht wirklich alle alten Connections zu reusen ... !
        Original geschrieben von array_hunter

        das mysql_close funktioniert auch nur in Verbindung mit mysql_connect...

        mysql_result ist immer langsamer als die alternativen Funktionen, welche den gesamten Datensatz liefern.

        2. Verbesserung durch geschickte Abfragen

        dann solltest du eigentlich nie SELECT * FROM nutzen, es sei denn , du benötigst alle Felder zur Ausgabe

        Das Indizieren von Tabellen ist ein sehr grosser Performance-Flaschenhals. Wenn es geht-auf Indizes verzichten.
        Irgendwie hast Du doch wohl den Schuß nicht gehört ... die einzige Performance Verschlechterung gibt's beim Einfügen von Datensätzen man sollte also nicht so rumasen mit Indizes ... und nur notwendige indizes erstellen ... Jede Abfrage wird allerdings um ein mehrfaches schneller ... Klar ... indizes sind nur dafür da das Datenbank Admins was zu tun haben ... *ROTFL*

        Original geschrieben von array_hunter

        die Dimensionierung der einzelnen Felder:
        Die Abfragen werden deutlich schneller, wenn du Felder--bisher als int deklariert, jetzt als smallint unsigned oder tyinyint unsigned
        setzt.
        Das ist letztlich davon abhängig was man speichern möchte und ob über das Attribut gesucht wird ... klar das man dann den kleinstmöglichen Type verwendet.

        Original geschrieben von array_hunter
        Bei Inserts immer:

        statt
        INSERT TO tabelle VALUES (...)

        jetzt INSERT INTO tabelle VALUES (...),(...) schreiben

        d.h. immer mehrere datensätze auf einmal einfügen
        Und was mache ich wenn ich nur einen Datensatz habe ... warten bis noch ein paar dazu kommen??

        Original geschrieben von array_hunter

        Für das Einfügen grosser Datenmengen immer LOAD DATA INFILE
        benutzen .

        3. Verbesserungen durch besseren Webserver

        dann ist natürlich als wichtigster Faktor, die Performance der DB beim Hoster( ich glaube, die CT hatte in der letzten oder vorletzten ausgabe die mysql-geschwindigkeit einiger Hoster getestet)
        Ist schon ein Unterschied , ob ein Webserver Raid hat oder Nicht .

        Der Hauptspeicher bringt auch noch mal ein gewisses Plus an geschwindigkeit.

        Ich hoffe, ich habe net soo grossen Mist geschrieben
        Nö ... ging schon ...

        Original geschrieben von array_hunter
        P.S. wer sich intensiver Mit der Optimierung von MySql beschäftigen möchte Klick oder Deutsch
        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


        • #5
          interessante Diskussion


          natürlich kann ich auch nicht auf Indizes verzichten, allerdings wenn ich mir manche Mysql-dbs anschaue, die strotzen nur so von Indizes und die user beschweren sich, weshalb das teil so lahmt bzw. der Traffic so stark gestiegen ist, nach dfer Umstellung
          auf viele abfragen per Index
          ...

          :
          --------------------------------------------------------------------------------
          Original geschrieben von array_hunter
          Bei Inserts immer:

          statt
          INSERT TO tabelle VALUES (...)

          jetzt INSERT INTO tabelle VALUES (...),(...) schreiben

          d.h. immer mehrere datensätze auf einmal einfügen

          --------------------------------------------------------------------------------



          Und was mache ich wenn ich nur einen Datensatz habe ... warten bis noch ein paar dazu kommen??
          ist natürlich nur für den fall gedacht, dass man mehrere DS auf einmal einfügen muss

          die Dimensionierung der einzelnen Felder:
          Die Abfragen werden deutlich schneller, wenn du Felder--bisher als int deklariert, jetzt als smallint unsigned oder tyinyint unsigned
          setzt.
          bei der Änderung von int -> tinyint war der Server ca. 20 % schneller als mit dem vorherigen Datentyp, allerdings nur bei der Indizierung von Datensätzen



          Fakt ist: eine vernünftige Organisation und geschicktes Abfragen hilft immer noch mehr als ein aufrüsten des Servers

          Irgendwie hast Du doch wohl den Schuß nicht gehört ...

          nana, wer wird denn gleich


          Zuletzt geändert von array_hunter; 27.08.2002, 23:49.
          <Life>Traumprojekt-Die Design-Community</life>

          Kommentar


          • #6
            zu der Anmerkung zu den Indizes von goth kann ich nur zustimmen. Hierzu gibt es von MySQL eine ganze Latte von Anmerkungen, wann ein Index sich lohnt.
            Prinzipiell solltest du nur die Felder indizieren, die in deiner where-clause auftauchen. Und natürlich sollten nicht zuviele Indizes auf einer Tabelle liegen, zumal auch der Plattenplatzverbrauch enorm ansteigt. Und umso größer deine Tabelle ist (Anzahl der Datensätze), umso schneller wird die Datenbank mit einem Index auf dem richtigen Feld.

            Kommentar


            • #7
              Kann man das deutsche Tutorial downloaden?Ich hab noch keinen Link gefunden...

              Kommentar


              • #8
                Vielleicht findest du hier, was du suchst: MySQL-Dokumentation

                Kommentar

                Lädt...
                X