Ein Kollege von mir hat heute vorgeschlagen, dass wir alle Abfragen in unserer Anwendung durchgehen und Indizes entsprechend hinzufügen.
Ich halte dies für eine vorzeitige Optimierung, da unsere Anwendung noch nicht einmal veröffentlicht wurde. Ich schlug vor, nach dem Start auf langsame Abfragen zu achten und dann die Indizes entsprechend hinzuzufügen.
Was ist der allgemeine Konsens beim Entwerfen Ihrer Datenbank? Sollten Sie jedes Mal, wenn Sie eine neue Abfrage schreiben, einen passenden Index hinzufügen? Oder ist es besser, nur zu überwachen und zu sehen, wie es geht?
database
database-design
indexing
Marco de Jongh
quelle
quelle
Antworten:
Vorzeitige Optimierung "optimiert" etwas aufgrund eines vagen, intuitiven Gefühls, das, wie Sie wissen, wahrscheinlich langsam sein wird, insbesondere zum Nachteil der Lesbarkeit und Wartbarkeit von Code . Dies bedeutet nicht, dass Sie nicht vorsätzlich bewährten Methoden in Bezug auf die Leistung folgen.
Manchmal ist es schwierig, eine Linie zu ziehen, aber ich würde definitiv sagen, dass es zu spät ist, keine Indizes hinzuzufügen, bevor Sie live gehen . Dies bestraft Early Adopters - Ihre eifrigsten und wichtigsten Benutzer - und gibt ihnen eine negative Sicht auf Ihr Produkt, die sie dann in Bewertungen, Diskussionen usw. verbreiten Gute Idee, aber ich würde sicherstellen, dass dies nicht später als in der Beta geschieht.
quelle
Denn nichts sagt mehr über Qualität aus, als dass Ihre Benutzer unter Designmangel leiden!
Sie sollten wissen, welche Abfragen Indizes benötigen, wenn Sie die Tabellen entwerfen, und wissen, nach welchen Spalten in where-Klauseln und Joins abgefragt wird. Diese sollten bereits indiziert sein, da sich bei zunehmender Auslastung oder gespeicherten Daten schnell herausstellen kann, was in einer Live-Umgebung möglicherweise nicht erkennbar ist. Was Sie in diesem Fall nicht tun möchten, ist, bei jeder "langsamen" Abfrage auf Indizes zu klicken. Am Ende erhalten Sie einen Index für alles.
quelle
"Vorzeitige Optimierung" bedeutet in seinem abfälligen Sinne eine kostenintensive Optimierung, die möglicherweise nicht erforderlich ist. Dies bedeutet nicht, dass alle Optimierungen vor dem letztmöglichen Zeitpunkt durchgeführt wurden, um einen Konkurs zu verhindern!
Insbesondere ist es legitim, basierend auf Leistungstests vor dem Start zu optimieren, um sicherzustellen, dass Sie einige vernünftige (wenn auch ungefähre) Anforderungen erfüllen, damit Ihre App nicht vollständig funktioniert.
Sie sollten Ihre Datenbank mindestens mit einer plausiblen Menge von Testdaten laden und die Reaktionsfähigkeit Ihrer App überprüfen. Dies ist nicht verfrüht, da Sie wissen, dass es passieren wird, und es werden alle Abfragen abgefangen, die absurd langsame Scans auslösen. Wie AE in einem Kommentar sagt:
Zumindest für Tabellen, deren Nutzung zunehmen soll.
Wenn Sie über umfangreiche Erfahrungen mit dem Datenbankmodul verfügen und die Tests bereits beim Schreiben des ersten Codeabschnitts geplant haben, werden Sie häufig feststellen, dass Sie die Abfrage ausführen, ohne sie auszuführen Ohne Index ist das Schreiben zu langsam. Natürlich können Sie so tun, als ob Sie es nicht wissen, und beobachten, wie der Test fehlschlägt, bevor Sie den Index zum Bestehen bringen. Es gibt jedoch keinen Grund für den bekannten fehlerhaften Code (da er nicht reagiert), live zu gehen.
quelle
Sie können Ihre Endbenutzer und Ihre Produktionsumgebung nicht wie eine Qualitätssicherung behandeln. Mit anderen Worten, Sie sagen, Sie werden es in der Produktion herausfinden. Ich denke nicht, dass dies der richtige Weg ist, und ich sehe, dass dieser Ansatz jeden Tag schrecklich schief geht .
Sie müssen eines beachten, da Sie dies nicht mit einem breiten Pinsel malen können.
Was ist Ihre gemeinsame Arbeitsbelastung ?
Das mag offensichtlich oder langweilig klingen, ist aber in der Praxis von Bedeutung. Wenn Sie 10 Abfragen haben, die 98% Ihrer Arbeitslast ausmachen (ziemlich häufig, ob Sie es glauben oder nicht), wäre meine Empfehlung eine harte Analyse vor der Produktion . Stellen Sie mit realistischen und repräsentativen Daten sicher, dass diese 10 Abfragen so gut wie möglich sind ( perfekt ist eine Verschwendung wertvoller Zeit und fast nicht erreichbar).
Bei den anderen 200 Abfragen, die 2% der Arbeitslast ausmachen , handelt es sich wahrscheinlich um Abfragen, die keinen großen Aufwand wert sind und den Eckpfeiler für die Fehlerbehebung bei Unregelmäßigkeiten in der Produktion darstellen. Das ist auch eine Realität und keine schrecklich schlechte Sache. Dies bedeutet jedoch nicht, dass Sie die Best Practices für die Indizierung ignorieren oder geschätzte Annahmen zum Abrufen von Daten treffen.
Es ist gängige und bewährte Methode, die Datenbankleistung vor der Produktion zu ermitteln. Tatsächlich gibt es eine relativ verbreitete Position für diese Art von Dingen, die als Entwicklungs-DBA bezeichnet wird .
Aber...
Einige nehmen das zu weit und machen es wahnsinnig, Indizes "nur für den Fall" hinzuzufügen. Jemand empfiehlt, dass dies ein fehlender Index ist? Fügen Sie es und vier weitere Variationen hinzu. Auch eine schlechte Idee. Sie müssen nicht nur über das Abrufen von Daten nachdenken, sondern auch über die Änderung von Daten. Je mehr Indizes in einer Tabelle vorhanden sind, desto höher ist im Allgemeinen der Overhead beim Ändern von Daten.
Wie die meisten Dinge gibt es ein gesundes Gleichgewicht.
Als lustige kleine Randnotiz ... Die Pluralisierung von "Index"
"Indizes" sind für Finanzleute
"Indizes" sind für uns
quelle
Nein, es ist keine vorzeitige Optimierung, aber es muss korrekt durchgeführt werden, wie es bei jeder Optimierung der Fall sein sollte.
Folgendes würde ich tun:
Datenbankserver sind komplexe und intelligente Software. Sie können Ihnen sagen, wie Sie sie optimieren können, wenn Sie zuhören können.
Die Schlüssel sind, die Leistung vor und nach der Optimierung zu messen und sich von der Datenbank mitteilen zu lassen, was sie benötigt .
quelle
Das Befolgen bewährter Muster für bekannte Probleme (wie das Auffinden eines Datensatzes anhand seiner ID) ist nicht verfrüht. Es ist nur sinnvoll.
Das heißt, Indizes sind nicht immer ein einfaches Geschäft. Während der Entwurfsphase ist es oft schwierig zu wissen, von welchen Indizes Ihr Datenverkehr abhängt und welche Schreiboperationen Engpässe verursachen. Daher würde ich argumentieren, dass einige "offensichtliche" Best Practices für das Schema-Design zum Einsatz kommen (verwenden Sie PKs, die für die entworfenen Lese- / Schreibmuster und Index-FKs geeignet sind). Erstellen Sie jedoch erst dann einen Index, wenn Ihre Stresstests dies erfordern.
quelle
Wenn Ihre Anwendung freigegeben wird, ist es zu spät.
Zu einem ordnungsgemäßen Entwicklungsprozess sollten jedoch Leistungstests gehören.
Verwenden Sie die Ergebnisse Ihrer Leistungstests, um zu entscheiden, welche Indizes hinzugefügt werden sollen, und überprüfen Sie deren Wirksamkeit, indem Sie die Leistungstests wiederholen.
quelle
Obwohl ich nicht der Meinung bin, dass jede Abfrage optimiert werden sollte, sind Indizes so sehr Teil von RDBMS, dass sie vor der Veröffentlichung berücksichtigt werden müssen. Wenn Sie eine Abfrage ausführen, teilen Sie dem System im Gegensatz zu anderen Formen der Programmierung nicht mit, wie es ausgeführt werden soll. Sie entwickeln eigene Pläne und stützen sich fast immer auf die Verfügbarkeit eines Index. Das Make-up und das Datenvolumen werden zu einem späteren Zeitpunkt ebenfalls berücksichtigt.
Hier sind einige Dinge, die ich berücksichtigen würde:
Nach Ihrer ersten Überprüfung sollten Sie einige Überlegungen anstellen, wann Sie diese erneut überprüfen sollten und wie Sie in der Lage sein werden, die dazu erforderlichen Informationen zu sammeln (Nutzung überwachen, Kopien von Kundendaten abrufen usw.).
Ich weiß, dass Sie nicht vorzeitig optimieren möchten, aber es ist fast sicher, dass Sie eine schlechte Leistung erzielen, ohne Ihre Datenbank zu indizieren. Wenn Sie dies aus dem Weg räumen, können Sie feststellen, ob andere Bereiche Leistungsprobleme verursachen.
quelle
Es hängt auch davon ab, wie viele Benutzer Sie erwarten. Sie sollten auf jeden Fall einige Auslastungstests durchführen und sicherstellen, dass Ihre Datenbank mit 10 bis 100 Sekunden und 1000 Sekunden gleichzeitiger Anforderungen Schritt halten kann. Auch hier kommt es darauf an, wie viel Verkehr Sie erwarten und welche Bereiche Sie voraussichtlich stärker als andere nutzen werden.
Im Allgemeinen würde ich die Bereiche fein abstimmen, von denen ich erwarte, dass der Benutzer die meisten Treffer zuerst erzielt. Dann würde ich alles fein abstimmen, das vom Standpunkt der Benutzererfahrung langsam ist. Wann immer Benutzer auf etwas warten müssen, haben sie eine schlechte Erfahrung und werden möglicherweise abgelehnt. Nicht gut!
quelle
Es ist empfehlenswert, durch eine Vorausanalyse zu ermitteln, welche Spalten definitiv einen Index benötigen. Es besteht die reale Gefahr einer allmählichen oder unerwarteten Verschlechterung der Leistung in der Produktion, wenn die Datenbankgröße zunimmt, wenn Sie absolut keine Indizes haben. Die Situation, die Sie vermeiden möchten, besteht darin, dass für eine häufig ausgeführte Abfrage eine große Anzahl von Tabellenzeilen durchsucht werden muss. Es ist keine vorzeitige Optimierung, Indizes zu kritischen Spalten hinzuzufügen, da Sie über einen Großteil der erforderlichen Informationen verfügen und die potenziellen Leistungsunterschiede erheblich sind (Größenordnungen). Es gibt auch Situationen, in denen der Nutzen von Indizes weniger klar ist oder mehr von den Daten abhängt - Sie können wahrscheinlich die Entscheidung für einige dieser Fälle verschieben.
Einige Fragen, die Sie stellen müssen, sind:
Wenn Tabellen immer klein sein werden (z. B. <100 Zeilen), ist es keine Katastrophe, wenn die Datenbank die gesamte Tabelle durchsuchen muss. Es kann nützlich sein, einen Index hinzuzufügen, dies erfordert jedoch ein wenig mehr Fachwissen oder Messung.
Wenn die Abfrage selten ausgeführt wird und keine strengen Anforderungen an die Antwortzeit (z. B. Berichterstellung) gestellt werden und die Anzahl der Zeilen nicht groß ist, ist es wahrscheinlich ziemlich sicher, das Hinzufügen von Indizes aufzuschieben. Auch hier können Fachwissen oder Messungen hilfreich sein, um festzustellen, ob dies von Vorteil ist.
Wenn diese Abfragen häufig ausgeführt werden und Tabellen mit vielen Zeilen berühren, sollten Sie ernsthaft in Betracht ziehen, einen Index vorab hinzuzufügen. Wenn Sie nicht sicher sind, ob dies bei einer Abfrage der Fall ist, können Sie die Datenbank mit einer realistischen Datenmenge füllen und dann den Abfrageplan anzeigen.
quelle