In den vergangenen Monaten haben wir uns relativ viel mit effizienter Datenbankoptimierung und der Reduzierung von Datenbankabfragen beschäftigt. Der Hintergrund war, dass durch die Einführung der Mehrsprachigkeit bei TutKit.com auf aktuell 23 Sprachen die Datenbanken völlig neue Dimensionen angenommen haben und die Anforderungen an Leistung und Skalierbarkeit gestiegen sind. So haben wir einen Sprint zur Datenbankoptimierung und Reduzierung von Datenbankabfragen vorgenommen mit ganz erstaunlichen Ergebnissen.
Dabei sind wir durch die verschiedenen Seitentypen (Kategorieseiten, Produktseiten, Blogseiten, …) gegangen und haben systematisch die Datenbankabfragen optimiert und reduziert. Um nur einmal zwei Beispiele zu nennen:
Damit haben wir die Datenbankabfragen um 92 bis 98 % reduzieren können bei gleichzeitig enorm verbesserter Geschwindigkeit, die ebenso nur noch 8 bis 17 % der vorherigen Zeit benötigt. Was für ein Ergebnis!
Hier einmal ein Vorher-Nachher-Vergleich bei eingeschalteter Debugbar unseres Laravel-Projekts vom gleichen Seitentypen. Es war eine Produktseite, die sehr viele Inhalte enthalten hat:

Über 2.000 Abfragen waren schon brutal viel, zugegeben. Warum wir solche hohen Werte hatten, werde ich in einen anderen Blogbeitrag beleuchten, wenn es um die Arbeit mit anderen Agenturen, mittelmäßigem Know-how und Technical Debt geht. Unser Backend-Entwickler hat sich diese Seite vorgenommen und konnte bereits nach 1,5 Tagen der Optimierung folgendes Ergebnis erreichen:

Da es sich dabei um den Seitentypen der Produkte handelte, hatte es einen sehr großen Einfluss auf sehr viele Seiten bei uns. Gerade diese Seiten sollen durch eine hohe Performance sowohl in der User Experience überzeugen als auch für Google attraktiv sein, damit diese Seiten höher ranken. Wir sind mit dem Ergebnis außerordentlich zufrieden.
Datenbankoptimierung ist ein wesentlicher Bestandteil der Softwareentwicklung und des Refaktoring, der eine Vielzahl von Vorteilen bietet. Entwickler und Unternehmen, die große Projekte wie Online-Shops oder Portale betreuen, sollten diese Praxis ernst nehmen aus folgenden Gründen:
Insgesamt trägt die Datenbankoptimierung wesentlich dazu bei, die Leistung, Zuverlässigkeit und Skalierbarkeit von Anwendungen und Projekten zu verbessern, was letztendlich zu einer besseren Benutzererfahrung, höheren Suchmaschinenrankings und niedrigeren Betriebskosten führt.
Wie sind wir nun genau vorgegangen? Hier gibt es eine Zusammenfassung!
Die Arbeit findet vor allem mit Debugging- und Profling-Tools statt. Debugging- und Profiling-Tools sind für Entwickler unerlässlich, um Probleme zu identifizieren und zu beheben sowie die Leistung von Anwendungen zu optimieren. Diese Tools bieten Einblicke in verschiedene Aspekte der Codeausführung und helfen Entwicklern sicherzustellen, dass ihre Anwendungen effizient und korrekt laufen. Eines der Tools, das wir in unserem Laravel-Projekt TutKit.com verwenden, ist Debugbar.
In jeder Programmiersprache umfasst der Workflow für die Verwendung eines Debugging- und Profiling-Tools typischerweise die folgenden Schritte
In unserem Laravel-Projekt verwenden wir die Debugbar, um unsere Anwendung zu überwachen und zu optimieren:
Im nächsten Schritt analysierten wir ähnliche Datenbankabfragen, identifizierten langsame und zeitaufwändige Abfragen, überprüften Datenbanktabellen ohne Indexe und überprüften unnötige Standardspalten. Diese umfassende Analyse ermöglichte es uns, die Datenbankleistung erheblich zu optimieren.
Beim Debuggen bietet unser Tool (wie Debugbar) Einblicke, aus welchen Dateien und Zeilen jede Abfrage stammt. Bei über 40 Dateien, einschließlich Vendor-Dateien, kann die Identifizierung der Ursache jedoch herausfordernd sein. So gehen wir vor:
Die gängigen Probleme in den den meisten Datenbanken sind:
Wir sind zuversichtlich, dass wir diese Probleme aufgrund unserer tiefen Kompetenzen und der langjährigen Erfahrung effizient lösen können. Dieses Fachwissen ermöglicht es uns, Probleme schnell zu identifizieren und zu beheben und so eine optimale Leistung für unsere und gern auch deine Projekte sicherzustellen.
Die wiederholte Abfrage der Datenbank für dieselben Daten kann zu unnötiger Belastung und langsamerer Leistung führen. Jeder Aufruf der Datenbank verbraucht Ressourcen und Zeit. Hier ist eine beispielhafte Lösung:

Die Leistungsverbesserung im aktualisierten Code ergibt sich aus der Reduzierung redundanter Datenbankabfragen. Durch das Speichern des Ergebnisses der translationQuality-Beziehungsabfrage in einer Variablen und dessen Wiederverwendung vermeidet der Code mehrere Datenbankaufrufe für dieselben Daten. Diese Optimierung verringert die Anzahl der Datenbankinteraktionen, was die Antwortzeit und Effizienz der edit-Methode verbessert.

Manchmal kann das direkte Abfragen der Datenbank mit Rohabfragen zu weniger und effizienteren Abfragen führen als die Verwendung von ORM-Methoden. Dieser Ansatz ermöglicht eine präzisere Steuerung der Abfrage und Optimierungen wie selektive Joins und Filterung. Durch das manuelle Erstellen der Abfrage können wir unnötigen Overhead eliminieren und sicherstellen, dass nur die benötigten Daten in einer einzigen, optimierten Abfrage abgerufen werden, was zu besserer Leistung und schnelleren Ausführungszeiten führt.


Die Leistungsaktualisierung verbessert die Effizienz erheblich, indem mehrere Datenbankabfragen in eine einzige, optimierte Abfrage umgewandelt werden. Anstatt alle Pakete abzurufen und dann im Speicher zu filtern, nutzt der neue Ansatz einen einzigen, gut gestalteten Datenbank-Join und eine bedingte Abfrage, um nur die erforderlichen Datensätze abzurufen. Dies minimiert nicht nur die übertragene Datenmenge, sondern reduziert auch den Verarbeitungsaufwand, was zu einer schnelleren Ausführung und einem optimierten Datenabruf führt.

Die Implementierung von Datenbankindezes ist eine leistungsstarke Technik zur Verbesserung der Seitengeschwindigkeit. Ein Index reduziert die Zeit, die zum Abrufen von Daten benötigt wird, erheblich, indem der Index der Datenbank ermöglicht, Datensätze effizienter zu lokalisieren und zuzugreifen. Diese Optimierung ist besonders wichtig für Tabellen mit großem Datenvolumen und häufigen Leseoperationen. Durch das Indizieren wichtiger Spalten, wie diejenigen, die in WHERE-Klauseln oder JOIN-Operationen verwendet werden, können wir die Abfrageausführungszeit drastisch verringern, was zu schnelleren Seitenladezeiten und einer reaktionsschnelleren Benutzererfahrung führt. Gut gestaltete Indizes stellen sicher, dass unsere Anwendung effektiv skalieren kann und dabei eine optimale Leistung beibehält, was letztendlich die Gesamtseitengeschwindigkeit verbessert.

Wir legen Wert auf Effizienz und Geschwindigkeit in unserem Workflow, was es uns ermöglicht, Aufgaben rechtzeitig zu erledigen. Durch den Einsatz optimierter Abfragen, das Minimieren redundanter Datenverarbeitung und die Anwendung unserer umfangreichen Erfahrung straffen wir unseren Entwicklungsprozess. Dieser Fokus auf Leistung stellt sicher, dass wir hochwertige Ergebnisse innerhalb kurzer Zeit liefern, Projekttermine einhalten und die Erwartungen unserer Kunden übertreffen.
Unsere Expertise beschränkt sich nicht auf eine bestimmte Programmiersprache. Wir wenden diese Prinzipien in verschiedenen Technologien und Frameworks an und passen unseren Ansatz an
die Anforderungen jedes Projekts an. Egal, ob es sich um PHP, MySQL, Python, JavaScript oder eine andere Sprache handelt, unser Engagement für Effizienz und Geschwindigkeit bleibt konstant und ermöglicht es uns, außergewöhnliche Leistung und schnelle Aufgabenbewältigung in jeder Entwicklungsumgebung zu liefern.
Die Reduzierung der Anzahl der Datenbankabfragen während eines Sprints kann die Gesamtleistung und Effizienz einer Anwendung erheblich verbessern. Um die Auswirkungen zu berechnen, identifizieren wir zunächst alle Datenbankinteraktionen im Code, wobei wir uns besonders auf häufige Abfragen und solche in kritischen Pfaden konzentrieren.
Zuerst messen wir die Ausführungszeit und Ressourcennutzung der vorhandenen Abfragen vor der Optimierung. Dazu verwenden wir Profiling-Tools, um die Latenz und Belastung jeder Datenbankinteraktion zu erfassen. Durch die Aggregation dieser Metriken können wir eine Leistungsbasislinie erstellen.
Anschließend implementieren wir optimierte Abfragen und refaktorisieren den Code, um redundante Anfragen zu minimieren. Dies könnte das Konsolidieren mehrerer Abfragen in eine einzelne, effizientere Abfrage, die Verwendung von Joins anstelle separater Abfragen oder die Nutzung von Caching-Strategien zur Vermeidung unnötiger Datenbankzugriffe umfassen.
Nach der Optimierung messen wir erneut die Ausführungszeit und Ressourcennutzung der refaktorierten Abfragen. Durch den Vergleich dieser Post-Optimierungsmetriken mit unserer Basislinie können wir die Verbesserungen quantifizieren. Wichtige Erfolgsindikatoren sind reduzierte Abfrageanzahl, geringere Ausführungszeit, verminderte Datenbankbelastung und verbesserte Antwortzeiten.
Darüber hinaus bewerten wir die breiteren Auswirkungen auf die Anwendungsleistung. Dies umfasst die Überwachung von Benutzererfahrungsmetriken wie Seitenladezeiten und Systemreaktionsfähigkeit. Durch die Dokumentation dieser Verbesserungen bieten wir eine klare, datengestützte Rechtfertigung für die Optimierungsbemühungen.
Insgesamt trägt dieser systematische Ansatz zur Reduzierung von Datenbankabfragen nicht nur zur Beschleunigung einzelner Sprints bei, sondern auch zur langfristigen Skalierbarkeit und Wartbarkeit der Anwendung bei.
Wenn du besondere Anforderungen an die Skalierbarkeit deines Projekts hast, weil du etwa die Mehrsprachigkeit und den internationalen Roll-out planst oder weißt, dass in Kürze Trafficspitzen (z. B. durch Fernsehwerbung) zu erwarten sind, bereite dich auf diese kommenden Lasten für deine Datenbanken vor. Gerade dann, wenn du das Gefühl hast, dass der Erstaufbau deiner Seite ohnehin schon sehr langsam geschieht, werden deine Datenbanken und die Datenbankabfragen nicht optimal sein und einen kommenden Ansturm von vielen Besuchern gleichzeitig auf der Seite nicht standhalten. Es kann zum Servercrash kommen.
Am einfachsten ist es, du misst über ein Debug-Tool selbst, wie viele Abfragen für den Seitenaufruf nötig sind. Einen weiteren Hinweis, dass die Serverreaktionenzeiten und damit die Datenbankabfragen zu lange dauern, findest du auch in der Search Console unter Einstellungen => Crawling-Statisitken. Ein Wert von über 1.100 ms durchschnittliche Reaktionszeit ist schon fast eine Katastrophe.

Die guten Werte liegen meiner Meinung nach unter 400 ms. John Müller von Google empfahl in einem Videocall zwischen 100 und 500 ms.

Der beste bisher von mir gesehene Durchschnittwert für die Serverantwortzeit lag bei 180 ms in der Crawling-Statistik der Search Console für einen Online-Shop auf Shopify-Basis, wo Texte, Bilder, Produkte etc. enthalten waren.
Wir berechnen für diese sehr spezialisierte Leistung einen Stundensatz von 240 Euro netto. Dabei sind wir in der Lage mit verschiedensten Datenbanksystem zu arbeiten wie beispielsweise MariaDB,
Mongo DB, PostgreSQL oder MySQL.
Wie lange die Optimierung von Datenbanken pro Seitentyp in deinem Projekt dauert, hängt immer auch vom Server und Hosting ab sowie auch vom eingesetzten Framework. Müssen wir alles klonen oder können wir bereits in einer vorbereiteten Testumgebung arbeiten? Haben wir SSH Zugang oder nicht? Ist bereits alles eingerichtet, sind zwei volle Arbeitstage pro Seitentyp eine gute Faustformel. Muss das Serversetup noch vorbereitet werden, kommt die Zeit entsprechend hinzu.
Nach einem Briefing sowie einer Erstanalyse können wir eine erste Schätzung über den tatsächlichen Zeitaufwand geben.
Wenn auch für dich eine Reduzierung von Datenbankabfragen und die damit verbundene serverseitige Leistungssteigerung interessant ist, melde dich gern bei uns.