Sven: (MySQL) Mehrere Datenbanken bei Seitenaufruf abfragen

Hallo,

also meine Frage besteht darin, wie man 3 unterschiedliche Datenbanken bei einem Seitenaufruf möglichst optimal abfragt, also mit möglichst wenig Belastung des Servers. Die 3 Datenbanken liegen alle auf dem gleichen Server.

Bis gestern hatte ich für jede Datenbank einen eigenen Benutzer in MySQL, so dass etwa der Benutzer 'web' auch nur auf die Datenbank mit gleichem Namen Zugriff hatte. Da musste ich dann immer den Benutzer wechseln... zuerst mit Benutzer web die DB abfragen, dann den Benutzer ircx anmelden und die DB abfragen, dann den Benutzer maildb anmelden und die DB abfragen...

Ich hab jetzt - etwas zu Lasten der Sicherheit - den Benutzer root dafür verwendet und dann bei der Abfrage direkt angegeben, welche DB ich abfragen möchte, also zb SELECT ircx.userdata FROM ... WHERE ... so muss ich zumindest nicht mehr den Benutzer wechseln, weil root eben auf alle DBs Zugriff hat.

Bringt das einen Geschwindigkeitsvorteil? Würde die Verwendung der MySQLi-Extension noch einen Schub bringen? Was könnte man sonst noch machen?

Grüße
Sven

  1. Hello,

    Ich hab jetzt - etwas zu Lasten der Sicherheit - den Benutzer root dafür verwendet und dann bei der Abfrage direkt angegeben, welche DB ich abfragen möchte, also zb SELECT ircx.userdata FROM ... WHERE ... so muss ich zumindest nicht mehr den Benutzer wechseln, weil root eben auf alle DBs Zugriff hat.

    "etwas" ist wohl extrem untertrieben.
    Ein Nutzer per Web-API sollte immer nur zu den allernötigsten Funktionen Zugang haben!

    Das gleich gilt für einen Nutzer, der über ungesichertes Internet und den Datenbank-Port Zugriff hat.
    Die nächste Stufe wäre dann primär unvrschlüsseöte Übertragung über SSL-Tunnel (VPN).

    ...

    Alle Rechte nur innerhalb des Daten-Centers!

    Ich lese aber aus Deinen spärlichen Beschreibungen, dass alle Datanbanken durch denselben Server bedient werden. Da sollte ein Benutzerwechsel mittels MySQL-Funktion (im PHP-API auch direkt vorhanden) möglich sein.

    Alternativ lönntest Du bei geeigneten rechten einen zusätzlichen Benutzer des DATENBANKSERVERS einrichten, der die passende  Rechte auf alle drei Datenbanken desselben Severs hat. Das geht!

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Hallo Sven,

    also meine Frage besteht darin, wie man 3 unterschiedliche Datenbanken bei einem Seitenaufruf möglichst optimal abfragt, also mit möglichst wenig Belastung des Servers. Die 3 Datenbanken liegen alle auf dem gleichen Server.

    warum nutzt Du drei verschiedene Datenbanken? Ist das überhaupt notwendig?

    Ich hab jetzt - etwas zu Lasten der Sicherheit - den Benutzer root dafür verwendet und dann bei der Abfrage direkt angegeben, welche DB ich abfragen möchte, also zb SELECT ircx.userdata FROM ... WHERE ... so muss ich zumindest nicht mehr den Benutzer wechseln, weil root eben auf alle DBs Zugriff hat.

    wenn Du schon die Benutzer verwalten darfst, warum gibst Du nicht einem vorhandenen normalen Benutzer Rechte auf die drei verschiedenen Datenbanken?
    Es ist definitiv keine gute Idee, für so etwas den root-Account zu verwenden.

    Bringt das einen Geschwindigkeitsvorteil?

    Was ergaben Deine Messungen. Erstellst Du Abfragen, die z.B. einen Join über die verschiedenen Datenbanken enthalten? Oder nutzt Du PHP, um Joins nachzubilden?

    Würde die Verwendung der MySQLi-Extension noch einen Schub bringen?

    Warum sollte es? Was hast Du gemessen?

    Was könnte man sonst noch machen?

    Das Handbuchkapitel zur Optimierung lesen und die Erkenntnisse gescheit anwenden: http://dev.mysql.com/doc/refman/5.0/en/optimization.html.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      warum nutzt Du drei verschiedene Datenbanken? Ist das überhaupt notwendig?

      Leider ja.
      Datenbank 1: Die ist für die Website, dort sind Profilinfos, Web-Content, etc. gespeichert.
      Datenbank 2: Die wird vom verwendeten IRCX-Server genutzt. Der hat seine eigene Anmeldeprozedur und verwendet dafür seine eigenen Tabellen. Auch Infos welcher Benutzer grade sich in welchem Chatraum aufhält usw.
      Datenbank 3: Wird vom E-Mail Server genutzt. Der ist komplett SQL-basiert und speichert dort die E-Mail Benutzer, eingegangene Mails, Servereinstellungen, etc. ab.

      Den Benutzer hat es jedoch nicht zu interessieren, ob da 3 Server-Anwendungen laufen oder nicht. Wenn sich ein neuer Benutzer registriert, muss er in alle 3 Datenbanken eingetragen werden. Der Benutzer sieht nur: Er hat ein Profil, er kann Chaträume betreten, nach chattenden Benutzern suchen, er hat ein eigenes Postfach, ...

      wenn Du schon die Benutzer verwalten darfst, warum gibst Du nicht einem vorhandenen normalen Benutzer Rechte auf die drei verschiedenen Datenbanken?
      Es ist definitiv keine gute Idee, für so etwas den root-Account zu verwenden.

      Hab ich jetzt gemacht.

      Erstellst Du Abfragen, die z.B. einen Join über die verschiedenen Datenbanken enthalten? Oder nutzt Du PHP, um Joins nachzubilden?

      Nein, Joins benutze ich (noch) nicht. Beim Login gibt der Benutzer z. B. seine E-Mail Adresse ein. Ich suche dann erstmal in der Tabelle userlogin nach der passenden ID, vergleiche Passwort usw. und wenn alles okay ist, lese ich auch Infos aus den Tabellen userdata, userpictures, usersettings, userguestbook, ... Dann suche ich mit der gleichen ID in der Datenbank ircx und speichere auch dort alles ab, was ich benötige. Das gleiche dann nochmal bei der Datenbank dbmail.

      Das ist alles erst nach und nach gewachsen... am Anfang war ein derartiger Funktionsumfang gar nicht geplant, es wurde dann immer mehr und ich habe einfach zusätzliche Abfragen eingebaut.

      Würde die Verwendung der MySQLi-Extension noch einen Schub bringen?

      Warum sollte es? Was hast Du gemessen?

      Naja, ich hatte gelesen man kann damit mehrere Abfragen vorbereiten und mit einer einzigen Verbindung dann abarbeiten lassen. So bräuchte ich zumindest für die Abfragen der Tabellen userlogin, userdata, userpics, usersettings ... nur noch einmal die DB zu kontaktieren.

      Was könnte man sonst noch machen?

      Das Handbuchkapitel zur Optimierung lesen und die Erkenntnisse gescheit anwenden: http://dev.mysql.com/doc/refman/5.0/en/optimization.html.

      Ich denke, erstmal sollte ich mir JOINs zunutze machen...?

      Gruß
      Sven

      1. echo $begrüßung;

        Würde die Verwendung der MySQLi-Extension noch einen Schub bringen?
        Warum sollte es? Was hast Du gemessen?
        Naja, ich hatte gelesen man kann damit mehrere Abfragen vorbereiten und mit einer einzigen Verbindung dann abarbeiten lassen. So bräuchte ich zumindest für die Abfragen der Tabellen userlogin, userdata, userpics, usersettings ... nur noch einmal die DB zu kontaktieren.

        Du meinst vermutlich Multi-Querys. Ein Aufruf mit mehreren SQL-Statements. Wenn dabei mehrere Ergebnismengen entstehen, muss man nach Abfragen der einen zur nächsten weiterschalten. Wenn du deine Prozesse vom Ablauf so organisieren kannst, dass dabei die Daten nicht erst noch zwischengespeichert werden müssen - z.B. wenn du Daten der zweiten Ergebnismenge benötigst, während du die erste verarbeitest - dann kann das vielleicht einen kleinen Performance-Vorteil bei erhöhter Code-Komplexität bieten. Ich würde das nicht so machen, schon weil ich mir kein signifikant verbessertes Aufwand-Nutzen-Verhältnis vorstellen kann. Wenn du damit einem Server an der Leistungsgrenze Luft verschaffen willst, glaube ich nicht an einen Erfolg. Leistungsfähigere Hardware sollte letzlich günstiger sein.

        echo "$verabschiedung $name";