Guten Vorabend zusammen ;-)
Ich hatte vor einiger Zeit das Datenbankdesign einer meiner Websites komplett überarbeitet und ich dachte, ich hätte es damit auch optimiert, doch bei diesem Punkt stutze ich derweil irgendwie...
Ich sollte dazu vielleicht ergänzen, dass ich auf meinem Rechner überhaupt keinen Performanceunterschied feststellen konnte - auf dem produktivsystem aber sehr wohl. Auf meinem Entwicklungsrechner kam das Ergebnis quasi "at once" - auf dem Server dauert dieselbe Abfrage schonmal gut und gerne an die 60s ****?
Zum Vergleich habe ich zwei Tabellen, welche sich sehr ähnlich sind.
Zum einen Tabelle A mit 3.500 Einträgen (die schnelle) und dann Tabelle B (die langsame) mit 13.000 Einträgen. Beide Tabellen haben eine ähnliche Struktur und arbeiten mit InnoDB:
---Tabelle A---
Primary Key
Primary Key2
Einige Foreign Keys
Datenfelder
---Tabelle B---
Primary Key
Einige ForeignKeys (unter anderem auch einer zu Tabelle A)
Datenfelder
Query zum durchforsten von Tabelle A:
Und Tabelle B durchsuche ich so:
Das mag jetzt vielleicht ein bisschen wirr aussehen, deswegen beschreib ich das nochmal mit meinen Worten:
Obgleich mri bewusst ist, dass Tabelle B 4 mal soviele Einträge hat, kommt das Ergebnis der Query zum Durchsuchen von Tabelle B viel viel langsamer, obwohl die Query eigentlich leichter strukturiert ist (nur ein LEFT OUTER JOIN). Außerdem liefert die Query nur ein Ergebnis zurück. Der andere Befehl liefert über 200 Resultate in seeeehr viel kürzerer Zeit zurück und das macht mich halt alles etwas stutzig...
Hat das WHERE mit dem Parameter, welcher ein PrimaryKey aus Tabelle A ist, etwas damit zu tun?
Liegt es doch tatsächlich an der Menge der Datensätze?
Kann man die Tabelle vielleicht umsortieren (sodass neuerer Einträge schneller gefunden werden (Weil man wohl viel öfter die neueren brauchen wird, als die ganz alten))?
Ich hoffe ihr könnt mich etwas aufklären
Falls ihr weitere Infos braucht, sagt Bescheid ;-)
Ciao,
Eroli
Ich hatte vor einiger Zeit das Datenbankdesign einer meiner Websites komplett überarbeitet und ich dachte, ich hätte es damit auch optimiert, doch bei diesem Punkt stutze ich derweil irgendwie...
Ich sollte dazu vielleicht ergänzen, dass ich auf meinem Rechner überhaupt keinen Performanceunterschied feststellen konnte - auf dem produktivsystem aber sehr wohl. Auf meinem Entwicklungsrechner kam das Ergebnis quasi "at once" - auf dem Server dauert dieselbe Abfrage schonmal gut und gerne an die 60s ****?
Zum Vergleich habe ich zwei Tabellen, welche sich sehr ähnlich sind.
Zum einen Tabelle A mit 3.500 Einträgen (die schnelle) und dann Tabelle B (die langsame) mit 13.000 Einträgen. Beide Tabellen haben eine ähnliche Struktur und arbeiten mit InnoDB:
---Tabelle A---
Primary Key
Primary Key2
Einige Foreign Keys
Datenfelder
---Tabelle B---
Primary Key
Einige ForeignKeys (unter anderem auch einer zu Tabelle A)
Datenfelder
Query zum durchforsten von Tabelle A:
SQL:
SELECT a.PrimaryKey, a.EinigeForeignKeys, a.EinigeDatenfelder, c.Datenfeld, d.Datenfeld
FROM Tabelle A a
INNER JOIN TabelleC c ON a.ForeignKey = c.PrimaryKey
[insgesamt 1 INNER JOIN, 2 JOINS und 1 OUTER LEFT JOIN]
WHERE ...
GROUP BY ...
ORDER BY ...
Und Tabelle B durchsuche ich so:
SQL:
SELECT b.PrimaryKey, b.ForeignKey, b.Datenfelder, e.PrimaryKey, e.Datenfeld
FROM TabelleB b
LEFT OUTER JOIN TabelleE e ON e.ForeignKey = b.ForeignKey
WHERE b.ForeignKey = ?PrimaryKeyAusTabelleA
Das mag jetzt vielleicht ein bisschen wirr aussehen, deswegen beschreib ich das nochmal mit meinen Worten:
Obgleich mri bewusst ist, dass Tabelle B 4 mal soviele Einträge hat, kommt das Ergebnis der Query zum Durchsuchen von Tabelle B viel viel langsamer, obwohl die Query eigentlich leichter strukturiert ist (nur ein LEFT OUTER JOIN). Außerdem liefert die Query nur ein Ergebnis zurück. Der andere Befehl liefert über 200 Resultate in seeeehr viel kürzerer Zeit zurück und das macht mich halt alles etwas stutzig...
Hat das WHERE mit dem Parameter, welcher ein PrimaryKey aus Tabelle A ist, etwas damit zu tun?
Liegt es doch tatsächlich an der Menge der Datensätze?
Kann man die Tabelle vielleicht umsortieren (sodass neuerer Einträge schneller gefunden werden (Weil man wohl viel öfter die neueren brauchen wird, als die ganz alten))?
Ich hoffe ihr könnt mich etwas aufklären

Falls ihr weitere Infos braucht, sagt Bescheid ;-)
Ciao,
Eroli
