MySQL Querys vs. PHP Array

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

  • MySQL Querys vs. PHP Array

    Hallo Community,

    erstmal Hallo an alle, bin seit längerem als eifriger Mitleser dabei, habe jetzt aber doch mal selbst eine Frage, und hoffe jemand kann mir zumindest ein paar Hinweise oder vllt sogar eine eindeutige Antwort leisten.

    Zur Frage: Ich besitze ein großes modelliertes Gitternetz aus knapp 600 Quadraten. Zu jedem dieser Quadrate existiert ein Datensatz in einer MySQL-Tabelle. Wenn das Gitternetz aufgebaut wird, soll bei Erzeugung jedes Feldes die dazugehörigen Daten aus der Tabelle abgefragt werden.

    Mir stellt sich nun folgende Frage: da das ganze recht lang dauert wäre es intressant wie eure Meinung ist, ob es sinnvoll ist, bei jedem Feld eine Anfrage an die Datenbank zu senden um die Werte für das jeweilige Feld zu erhalten (also 600 Abfragen in Reihe) oder ob es sinnvoller ist, einmal alle Daten abzufragen und diese in ein PHP Array zu speichern (oder in ein Javascript Array) und bei Erzeugung eines Feldes aus dem PHP-Array abzufragen.

    Was arbeitet hier schneller? Die Datenbank? Oder der Serverspeicher der das Array bereithält? Oder gibts vielleicht eine noch bessere Möglichkeit? Vielleicht hilft mir eine View weiter?

    Über Tipps, Anregungen und alles andere bin ich überaus dankbar.

    Viele Grüße und einen schönen Montag!

    Jaykopp

  • #2
    N'abend,


    Eine Abfrage ist definitiv schneller. Du musst halt nur die Feldkoordinaten mit speichern. Also zB. 1_1, 1_2, ... für die ersten beiden Felder von oben Links nach oben Rechts, ...

    Kommentar


    • #3
      Ich denke auch das eine Abfrage flotter ist, hätte es dann so nachm Motto
      array[x][y] = wert
      gespeichert.
      Kannst aber mal (wenn es nicht allzu viel Arbeit ist) nen kleines Benchmark machen. Wär sicher interessant
      Du kannst jeden Tag wie deinen letzten leben, du musst nur jeden Tag das Gleiche tun.

      Denk' mal drüber nach!

      Kommentar


      • #4
        Wieso brauchst du dann 600 Queries? Es reicht doch ein Query. Die Ausgabe gestaltest du dann entsprechend.

        Ansonsten kannst/solltest du mal genauer beschreiben, was genau du eigentlich vorhast, damit man dein Vorhaben mal genauer überdenken kann.

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Hallo! Danke schonmal für eure Antworten. Ähnliches habe ich schon vermutet.

          Um das Vorhaben kurz näher zu beschreiben: Ich habe eine "Landkarte". Diese Landkarte ist ein Hintergrundbild, die mit 600 Div-Containern belegt wird um die Karte in 600 Quadranten (Mit X-Y-Koordinaten) einzuteilen. Für jedes Feld soll geprüft werden, ob auf diesem Feld etwas von Interesse für den Benutzer ist. Wenn ja soll das Feld grün aufleuchten. Da aber nicht jedes Feld von interesse ist, kann es sein dass für einige Felder überhaupt kein Datensatz vorhanden ist, geprüft werden muss aber leider trotzdem.

          Hoffe das klingt verständlich. Über weitere Tipps oder Anregungen bin ich dankbar.

          Beste Grüße

          Kommentar


          • #6
            Re: MySQL Querys vs. PHP Array

            Original geschrieben von Jaykopp
            Was arbeitet hier schneller? Die Datenbank? Oder der Serverspeicher der das Array bereithält?
            Die Datenbank legt das Resultset auch erstmal im Speicher ab. Wenn sie auf der selben Maschine läuft, dann sogar im selben Speicher.

            Überlege mal was abläuft, wenn du eine DB-Afrage machst:
            1 Zend Engine führt Funktionsaufruf von mysql_query() aus
            2 PHP-MySQL-Modul kommuniziert mit dem MySQL-Server
            3 MySQL-Server analysiert und optimiert die Query
            4 MySQL-Server führt die Query aus, d.h. baut das Resultset im Speicher zusammen
            5 MySQL-Server gibt ein Handle auf das Resultset ans PHP-MySQL-Modul
            6 Zend Engine führt Funktionsaufruf von mysql_fetch_*() aus
            7 PHP-MySQL-Modul holt übers Handle einen Datensatz

            Wenn du 600 Anfragen stellst, passiert das alles 600 mal.
            Wenn du nur eine Abfrage machst, passiert 1-5 nur einmal. In Schritt 4 belegt MySQL zwar mehr Speicher, aber 600 Results sind so klein, dass man darüber nicht diskutieren mus. Schritt 6 und 7 wird 600 mal stattfinden, da kommst du nicht drumherum.

            Wir haben also bei 600 Einzelanfragen insgesamt 600*7=4200 Schritte. Bei der anderen Variante mit nur einer Abfrage haben wir 5+600*2=1205 Schritte.
            Da kommt bei dir hoffentlich schon ein Verdacht auf, welcher Ansatz schneller ist.

            Die einzelnen Schritte haben sehr unterschiedliche "Kosten". Generell kostet es immer viel, wenn auf die Platte zugegriffen werden muss. MySQL versucht die Zugriffe daher zu minimieren, z.B. durch sequentielles Lesen (viele Daten in einem Rutsch). Davon kannst du nicht profitieren, wenn du immer nur einen Datensatz pro Anfrage ziehst.
            Schritt 3 ist auch nicht billig. Hier könnte man mit prepared statements einiges rausholen.
            Aber Schritt 2 und 5 kann man nicht umgehen oder optimieren. Besonders teuer wird es, wenn Webserver und DB-Server über ein Netzwerk kommunizieren - Netzwerklatenzen sind noch schlimmer als IO.

            Du hast nun hoffentlich einen Eindruck bekommen, wie vielschichtig diese Frage ist.

            Ich denke auch das eine Abfrage flotter ist, hätte es dann so nachm Motto
            array[x][y] = wert
            gespeichert.
            Die Richtung stimmt. Mit 600 Datensätzen stößt du wahrscheinlich auch nicht ans memory_limit, also kannst du es so implementieren.
            Aber eigentlich musst du die Werte gar nicht erst in ein Array schaufeln. Du kannst die eine Abfrage schicken und dann in einer Schleife deine Quadranten "abwickeln". In jeder Iteration ziehst du dann den passenden Datensatz aus dem schon fertigen Resultset. Somit hast du immer nur einen Datensatz im PHP-Speicher.
            Da man bei MySQL keinen wahlfreien Zugriff auf Results in einem Set hat, sondern immer nur "den nächsten" bekommt, muss das Resultset natürlich so sortiert sein, wie du deine Quadranten durchiterierst.

            Kommentar


            • #7
              Hallo onemorenerd,

              vielen herzlichen Dank für deine ausführliche Antwort. Das hilft mir mehr als weiter, nicht nur bei meinem aktuellen Problem, sondern auch was meine Allgemeinbildung in Sachen MySQL angeht.

              Danke für die geopferte Zeit! Ich denke ich weiß jetzt wo ich anfangen muss

              Ich werde, sofern ich fertig bin, berichten ob und wie das ganze geklappt hat.

              Beste Grüße,

              Jaykopp

              Kommentar

              Lädt...
              X