hawkmaster: MySQL Performance und Prepared Statements Fragen

Hallo zusammen,
ich stelle gerade meine gesamte PHP Anwendung auf PDO und Prepared Statements um.
Ich habe eine Datei "db.inc.php" in der ich die MySQL Connection mache. Diese Datei wird ganz am Anfang includiert, wird also bei jedem Refresh geladen. In diese Datei habe ich jetzt auch mal sämtliche Prepared Statements eingefügt.
Also etwa;
$dbSelectPrintdata = $DBO->prepare("SELECT PValue,PName,PrintdataID FROM printdata WHERE PrintjobID = :printjobid AND SUBSTRING(PName,1,18) = 'InsertPaperCatalog' ORDER BY PrintdataID ASC");
$dbSelectLogin = $DBO->prepare("SELECT usr FROM login WHERE usr = :user");
...
so gibt es jetzt noch sehr viele Zeilen mit verschieden Tabellen, Inserts und Udates.

1. Wie seht ihr das hinsichtlich der Performance? Ich wollte eigentlich der Übersicht halber alle Prepared Statements in einer Datei haben.
Ist dies vielleicht hinsichtlich der Last für den MySQL Server nicht optimal weil er ja bei jedem Refresh der Seite immer alles "einlesen" muss?
Wäre es besser die jeweilige Prepared Statement in die PHP Datei einzufügen wo sie auch benötigt wird?

2.
Eine Tabelle "userdata" hat ca. 20 Spalten.
An verschiedenen Stellen in der Anwendung werden immer wieder unterschiedliche Infos aus Spalten benötigt.
Einmal "username", "password"
Dann wieder "Accountnumber"
Dann wieder wo anders "Loginname"
Jetzt müsste ich jedesmal eine eigene Prepared Statement machen also etwa;
$dbSelectUser_loginname = $DBO->prepare("SELECT loginname FROM userdata WHERE usr = :user");
dann wieder;
$dbSelectUser_uname_pwd = $DBO->prepare("SELECT username, password FROM userdata WHERE usr = :user");

Ich habe das jetzt vereinfacht indem ich einmal ALLE 20 Spalten im Select aufnehme. Dann brauche ich nur noch ein Prepared Statement und kann später gezielt mit "Fetch" die Spalten ansprechen die ich brauche.
Meine Frage ist nur: Ist es ein großer Unterschied für den Server ob man immer gleich 20 Spalten abfrägt oder nur eine oder zwei?

vielen Dank und viele Grüße
hawk

  1. echo $begrüßung;

    1. Wie seht ihr das hinsichtlich der Performance? Ich wollte eigentlich der Übersicht halber alle Prepared Statements in einer Datei haben.
      Ist dies vielleicht hinsichtlich der Last für den MySQL Server nicht optimal weil er ja bei jedem Refresh der Seite immer alles "einlesen" muss?

    Ja, wenn die PS immer wieder abgearbeitet werden, auch wenn sie gar nicht benötigt werden, dann ist das unsinnig. Jedes PS muss ja erstmal zum Server gelangen und dann werden dafür auf Server und Client Daten vorgehalten.

    Wäre es besser die jeweilige Prepared Statement in die PHP Datei einzufügen wo sie auch benötigt wird?

    Ich sehe es als besser an, die Daten beschaffenden Teile zu kapseln. Wenn die Seite X die Datenstruktur Y benötigt, dann ruft sie eine Funktion getDataY() auf, und bekommt was sie will, ohne sich näher drum zu kümmern, wie die Abfrage vonstatten geht. Die jeweilige getData-Funktion wird also nur im Bedarfsfall aufgerufen (und alle anderen nicht) und kann nun ihrerseits die Daten wo auch immer her und wie auch immer beschaffen. Wenn sie dazu PS verwendet, stehen diese innerhalb der Funktion.

    1. Eine Tabelle "userdata" hat ca. 20 Spalten.
      An verschiedenen Stellen in der Anwendung werden immer wieder unterschiedliche Infos aus Spalten benötigt.

    Hier bietet sich an, einmalig ein User-Objekt zu erstellen, dessen Eigenschaften dann von den jeweiligen Stellen angesprochen werden.

    Ich habe das jetzt vereinfacht indem ich einmal ALLE 20 Spalten im Select aufnehme. Dann brauche ich nur noch ein Prepared Statement und kann später gezielt mit "Fetch" die Spalten ansprechen die ich brauche.
    Meine Frage ist nur: Ist es ein großer Unterschied für den Server ob man immer gleich 20 Spalten abfrägt oder nur eine oder zwei?

    Ein Roundtrip ist weniger aufwendig als viele. Die zu übertragenden Daten einer 20-Spalten-Abfrage werden sich wohl im Bereich weniger (k)B bewegen und das fällt kaum ins Gewicht. Dass dann ein paar Spalten umsonst abgefragt wurden ist auch nicht schlimm. Wenn du hingegen in dem einen Script immer nur 2 Spalten benötigst und nichts weiter, kann man dafür ja überlegen, eine eigene Abfrage zu erstellen. Dazu sollte man den Code-Pflegeaufwand zweier Funktionen gegen den Daten-Overhead einer 20-Spalten-Abfrage abwägen.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      wie immer herzlichen Dank für deine fundierten Antworten.
      Das hat meine Vermutungen und Gedanken bestätigt.

      <<Ich sehe es als besser an, die Daten beschaffenden Teile zu kapseln. Wenn die Seite X die Datenstruktur Y benötigt, dann ruft sie eine Funktion getDataY() auf,...

      Ich bin schon dazu übergegangen einzelne PS in Funktionen zu packen. Jetzt wo du es nochmals bestätigst werde ich versuchen möglichst alle SQL Abfragen in Funktionen zu packen.
      Die kann ich ja dann trotzdem übersichtlich alle in der "db.inc.php" lassen denn die Funktionen werden dann ja nur aufgerufen wenn sie vom jweiligen Script benötigt werden.

      vielen Dank und viele Grüße
      hawk