Datenbanken - Leistungsvergleich
Christof
- datenbank
Hallo,
Ich plane die Entwicklung einer Webanwendung die vorraussichtlich sehr viele Einzelabfragen an die Datenbank stellt. Ich sage einfach mal als Zahl 500-1000 Abfragen pro Seitenaufbau. Da ich noch nie in dieser Größenordnung gearbeitet habe fällt es mir schwer vorzustellen wie stark dies an der Performance zieht. Es würde sich stets um Einzelabfragen, also Auswahl EINES Datensatzes handeln. Des Weiteren könnten die einzelnen Tabellen wohl recht umfangreich werden.
Was würdet Ihr empfehlen zu nutzen (reicht eine MySQL-DB aus?)?
Gibt es offizielle Performancetests?
Was schätzt ihr ein : Wieviel Verzögerung würde eine solche Menge Abfragen ergeben?
Gruß
Christof
Hallo Christof,
Ich plane die Entwicklung einer Webanwendung die vorraussichtlich sehr viele Einzelabfragen an die Datenbank stellt. Ich sage einfach mal als Zahl 500-1000 Abfragen pro Seitenaufbau.
dann liegt mit Sicherheit fehlerhafte Planung vor. Die Performance wird selbst mit dem performantesten Datenbankmanagementsystem (DBMS) auf der performantesten Hardware unzureichend sein. Ich kann mir ehrlich gesagt nicht vorstellen, warum man so viele Abfragen benötigen sollte. Ich vermute, dass sich an Deinen SQL-Statements viel machen lässt.
Da ich noch nie in dieser Größenordnung gearbeitet habe fällt es mir schwer vorzustellen wie stark dies an der Performance zieht. Es würde sich stets um Einzelabfragen, also Auswahl EINES Datensatzes handeln.
Warum wählt jede Abfrage genau einen Datensatz aus? Warum nicht eine hübsche Abfrage gestalten, die Dir die 500-1000 Datensätze in einem zurückliefert. Das ist die eher übliche Vorgehensweise.
Ich vermute deswegen, dass sich Deine 500-1000 Abfragen drastisch reduzieren lassen könnten, wenn Du JOIN, UNION, SUBSELECT, Views, Stored Procedures, ... nutzt, das heißt die Möglichkeiten von SQL richtig ausreizt. Dazu läßt sich ohne Kenntnis dessen, was Du im Detail vorhast, natürlich nichts Konkretes sagen.
Des Weiteren könnten die einzelnen Tabellen wohl recht umfangreich werden.
das ist kein Problem. Dafür sind DBMS da.
Was würdet Ihr empfehlen zu nutzen (reicht eine MySQL-DB aus?)?
Mit wievielen Seitenaufrufen in welchem Zeitraum rechnest Du? Eine Seite pro Minute? Dann sollte ein einzelner Datenbankserver noch ausreichen. Du könntest natürlich einen hübschen Cluster verwenden, wenn Du Dir das leisten kannst.
Gibt es offizielle Performancetests?
Was verstehst Du unter "offiziell"?. Es gibt Benchmarks für Datenbanken. Und die fallen je nach Anforderungen und Auftraggeber unterschiedlich aus. Es geht um die konkrete Optimierung Deiner Abfragen mit Deinem Datenbestand.
Was schätzt ihr ein : Wieviel Verzögerung würde eine solche Menge Abfragen ergeben?
Eine enorme. Wie ich bereits schrieb: Plane um.
Freundliche Grüße
Vinzenz
Hi,
Erstmal danke, ich habe schon so etwas erwartet, aber ich muss noch etwas korrigieren. Wenn ich einen innerjoin o.ä. mache und damit mehrere Daten mit einem SQL-Aufruf mache (sagen wir mal 5) dann macht das DBMS doch intern diese 5 Abfragen oder nicht ?
Gruß
Christof
Hallo
Erstmal danke, ich habe schon so etwas erwartet, aber ich muss noch etwas korrigieren. Wenn ich einen innerjoin o.ä. mache und damit mehrere Daten mit einem SQL-Aufruf mache (sagen wir mal 5) dann macht das DBMS doch intern diese 5 Abfragen oder nicht ?
Nein, das ist eine Abfrage. Diese Abfrage kostet Zeit, typischerweise alles andere als das fünffache einer Einzelabfrage, wahrscheinlich nur marginal mehr als diese. Zusätzlich Zeit kostet die Verbindung mit der Datenbank (falls erforderlich) und das Absetzen der Query. Die Abfrage durchläuft eventuell nochmals den Optimierer - all das kann zusätzlich Zeit kosten.
Deine fünf Einzelabfragen werden im Normalfall das Mehrfache an Zeitaufwand benötigen als die eine Abfrage, die fünf Datensätze zurückliefert, wahrscheinlich sogar mehr als das fünffache der Zeit.
Mit Subselects (ab MySQL 4.1) kannst Du ggf. nochmals etwas rausholen, wir hatten hier Threads, wo die Performance mit UNION (ab MySQL 4.0) deutlich gesteigert werden konnte, Views (ab MySQL 5) könnten hilfreich und performancesteigernd sein, ... Das hängt halt alles von der Dir vorliegenden MySQL-Version, Deiner Datenbankstruktur und nicht zuletzt von Deiner Problemstellung ab. Konkret könnten wir Dir Optimierungsvorschläge machen, wenn wir von Dir hier Konkretes lesen könnten, Glaskugeln sind hier immer noch rar :-)
Nutze EXPLAIN, um Deine Abfragen zu optimieren. Aber mach' auf keinen Fall Einzelabfragen - oder versuche einen JOIN mittels der API nachzubauen (das haben wir hier schon öfter gesehen). Unperformanter geht es im Normalfall kaum.
Freundliche Grüße
Vinzenz
Hallo,
Nein, das ist eine Abfrage. Diese Abfrage kostet Zeit, typischerweise alles andere als das fünffache einer Einzelabfrage, wahrscheinlich nur marginal mehr als diese. Zusätzlich Zeit kostet die Verbindung mit der Datenbank (falls erforderlich) und das Absetzen der Query. Die Abfrage durchläuft eventuell nochmals den Optimierer - all das kann zusätzlich Zeit kosten.
... Nicht zu vergessen der Aufwand den das Umsetzen des Programmcodes in die Datenbank (Db-Scnittstelle der Programmiersprache, Umsetzung ins (Netzwerk)-Protokoll der DB, Übertragen zum DB-Server, Parsen im Server) und den ganzen Weg zurück ins Progamm. Normalerweise sind Dinge, die vollkommen in der Datenbank ablaufen daher ungleich schneller, weil eben diese ganze Umsetzungs/Konvertierungsarbeit entfällt.
Noch ein Tipp: Ich kenne zwar mySQL nicht wirklich, aber in der Regel gibt es noch ein Optimierungspotential, wenn man mit sog. Bind-Variablen auch in Abfragen arbeitet, da der Optimizer bei wiederholter verwendung einer Abfrage diese nicht immer neu auswerten (Stichwort: prepare) muss.
Grüße
Klaus
Hallo Klaus,
Noch ein Tipp: Ich kenne zwar mySQL nicht wirklich, aber in der Regel gibt es noch ein Optimierungspotential, wenn man mit sog. Bind-Variablen auch in Abfragen arbeitet, da der Optimizer bei wiederholter verwendung einer Abfrage diese nicht immer neu auswerten (Stichwort: prepare) muss.
dieses Feature unterstützt MySQL derzeit (noch) nicht.
Auch wenn verschiedene DB-Abstraktionsschichten prepare-Statements anbieten, können diese nicht nativ mit MySQL-Möglichkeiten umgesetzt werden.
Freundliche Grüße
Vinzenz
echo $begrüßung;
dieses Feature [prepares statements] unterstützt MySQL derzeit (noch) nicht.
Bist du da sicher?
Seit der neuen, 4.1er MySQL-API widmet das Handbuch den Prepared Statements einige Kapitel.
Und außerdem gibt es ein Kapitel SQL Syntax for Prepared Statements im Syntax-Teil des Handbuch.
echo "$verabschiedung $name";
Hallo dedlfix,
dieses Feature [prepares statements] unterstützt MySQL derzeit (noch) nicht.
Bist du da sicher?
jetzt nicht mehr :-)
Ich hatte das kürzlich in einem Artikel zu PDO (den ich jetzt nicht finde :-() gelesen und leider unkritisch übernommen. Danke für die Info.
Freundliche Grüße
Vinzenz
Hi,
Was würdet Ihr empfehlen zu nutzen
ein Verfahren, welches die Zahl der Abfragen reduziert.
Was schätzt ihr ein : Wieviel Verzögerung würde eine solche Menge Abfragen ergeben?
_Sehr_ viel. Reduziere die Menge auf einen einstelligen Wert.
Cheatah
Hallo Forum,
Ich plane die Entwicklung einer Webanwendung die vorraussichtlich sehr viele Einzelabfragen an die Datenbank stellt. Ich sage einfach mal als Zahl 500-1000 Abfragen pro Seitenaufbau.
Wenn du nicht gerade 1000 Tabellen hast ist das zu viel.
Ich habe hier z.B. einen Webshop, da reichen 2 bis maximal 3 Abfragen pro Seitenaufruf völlig aus.
Was machst du mit deiner Anwendung, dass die so viele Abfragen macht?
Gruß
Alexander Brock