php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-05-2009, 08:44
Jaykopp
 Newbie
Links : Onlinestatus : Jaykopp ist offline
Registriert seit: May 2009
Beiträge: 3
Jaykopp ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 04-05-2009, 09:38
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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, ...
Mit Zitat antworten
  #3 (permalink)  
Alt 04-05-2009, 14:26
Click
 Member
Links : Onlinestatus : Click ist offline
Registriert seit: Aug 2006
Beiträge: 228
Click ist zur Zeit noch ein unbeschriebenes Blatt
Click eine Nachricht über ICQ schicken
Standard

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!
Mit Zitat antworten
  #4 (permalink)  
Alt 04-05-2009, 16:56
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 04-05-2009, 17:25
Jaykopp
 Newbie
Links : Onlinestatus : Jaykopp ist offline
Registriert seit: May 2009
Beiträge: 3
Jaykopp ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 04-05-2009, 18:32
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard Re: MySQL Querys vs. PHP Array

Zitat:
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.

Zitat:
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.
Mit Zitat antworten
  #7 (permalink)  
Alt 04-05-2009, 20:02
Jaykopp
 Newbie
Links : Onlinestatus : Jaykopp ist offline
Registriert seit: May 2009
Beiträge: 3
Jaykopp ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:18 Uhr.