Mit mehr als einem index pro Tabelle ist das gefährlich?
In einer ehemaligen Firma, bei der ich arbeitete, die Faustregel war, dass eine Tabelle sollte nicht mehr als ein index (so dass die ungeraden Ausnahme, und bestimmten parent-Tabellen mit Referenzen zu fast allen anderen Tabellen und somit aktualisiert werden sehr Häufig).
Die Vorstellung, dass oft, Indizes Kosten das gleiche oder mehr zu wahren, als Sie gewinnen. Beachten Sie, dass diese Frage anders zu indexed-view-vs-Indizes auf Tabelle die motivation ist nicht nur Berichterstattung.
Ist das wahr? Ist dieser index-Purismus Wert?
In Ihrer Karriere haben Sie in der Regel vermeiden Sie die Verwendung von Indizes?
Was sind die Allgemeinen large-scale-Empfehlungen in Bezug auf Indizes?
Derzeit und in den letzten Firmen, die wir verwenden SQL-Server, so dass jedes Produkt bestimmten Richtlinien sind zu begrüßen.
- Was meinst du mit gefährlich? Ich glaube nicht, dass irgendeine menschliche Leben stehen auf dem Spiel, egal wie viele Indizes, die man auf den Tisch stellen.
- Das klingt wie "ein wenig wissen ist eine gefährliche Sache": vor langer Zeit, der CEO meines Arbeitgebers hatte, stolperte über einen Artikel über Probleme mit SourceSafe. Nächste Woche, jede Art von version control wurde verboten, Auf den Hohen, wie "es ist gefährlich". Heiterkeit folgte.
- Würden Sie denken? Ich weiß nicht, ich habe gegriffen zu laufen, eine unerlaubte SVN-server auf meiner dev-box und verfolgen Sie es.
file.php
,file1.php
,file1_.php
,file_20071101.php
- und/oderfile_1piskvor.php
war der offizielle "versioning" - Regelung (d.h. nur geben Sie ihm einen Namen anders als die Reale Sache; sicherungen? wir brauchen keine steenking sicherungen!). Unerwartetes Ergebnis: "Der Geschäftsführer ging 'Optimierung' wieder und nun ist die app defekt ist. Haben Sie eine Art von, du weißt, frühere version für die Dateien, wink wink, nudge nudge?" (Wir haben es geschafft, ein echtes SVN-server endlich, nach einigen Jahren).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie genau so viele Indizes, wie Sie benötigen zu erstellen. Nicht mehr, nicht weniger. Es ist einfach so.
Jeder "weiß", dass ein index verlangsamt DML-Anweisungen für eine Tabelle. Aber aus irgendeinem Grund nur sehr wenige Menschen tatsächlich die Mühe, zu testen, wie "langsam" es wird in Ihrem Kontext. Manchmal bekomme ich den Eindruck, dass die Leute denken, dass das hinzufügen eines weiteren index hinzufügen mehrere Sekunden, um jeder eingefügten Zeile, so dass es ein game-changing business Kompromiss, dass einige fiktive hotshot Benutzer sollte entscheiden, in einem sitzungszimmer.
Möchte ich ein Beispiel, das ich erstellt habe auf meinem 2 Jahre alten pc mit einem standard-MySQL-installation. Ich weiß, Sie tagged die Frage, SQL-Server, aber das Beispiel sollte einfach umgerüstet werden. Ich legen 1,000,000 Zeilen in den drei Tabellen. Eine Tabelle ohne Indizes einer Tabelle mit eine index und eine Tabelle mit neun Indizes.
Meine Zeiten sind:
Ich bin besser mit SQL aus als Statistiken und Mathe, aber ich würde gerne glauben, dass:
Hinzufügen 8-Indizes in meine Tabelle Hinzugefügt (6,98-1,5) 5,48 Sekunden insgesamt. Jeder index würde dann dazu beigetragen haben, 0,685 Sekunden (5,48 /8) für alle 1.000.000 Zeilen. Das würde bedeuten, dass die zusätzlichen overhead pro Zeile pro index hätte 0,000000685 Sekunden. JEMAND ANRUFEN DER VERWALTUNGSRAT!
Abschließend möchte ich sagen, dass die oben genannten Testfall nicht beweisen Scheiße. Es zeigt nur, dass heute Abend, ich war in der Lage das einfügen von 1.000.000 aufeinanderfolgende ganze zahlen in einer Tabelle in einer single-user Umgebung. Ihre Ergebnisse wird anders sein.
Dass ist absolut lächerlich. Zuerst müssen Sie mehrere Indizes, um perfom richtig. Zum Beispiel, wenn Sie einen Primärschlüssel haben, haben Sie automatisch einen index. das bedeutet, dass Sie nicht indizieren kann, alles, was mit der Regel, die Sie beschrieben. Also, wenn Sie nicht index foreign keys, joins langsam und wenn Sie keine index-Felder in der where-Klausel Abfragen immer noch langsam sein. Ja, Sie haben zu viele Indizes, wie Sie das tun nehmen zusätzliche Zeit, um insert-und update und löschen von Datensätzen, aber nicht mehr als eine ist nicht gefährlich, es ist eine Anforderung, ein system, das gut funktioniert. Und ich habe festgestellt, dass Benutzer tolerieren eine längere Zeit, um legen besser als Sie vertragen eine längere Zeit bis zur Abfrage.
Inzwischen die Ausnahme sein könnten, für ein system, das dauert Tausende Messwerte pro Sekunde von einigen automatisierten Anlagen. Dies ist eine Datenbank, die in der Regel nicht über Indizes verfügen, die für speed-Einsätze. Aber in der Regel diese Arten von Datenbanken sind auch nicht zum Lesen verwendet, werden die Daten übertragen, anstatt täglich ein reporting-Datenbank indiziert ist.
Ja, definitiv - zu viele Indizes auf eine Tabelle kann schlimmer sein als gar keine Indizes überhaupt. Aber ich glaube nicht, dass es gut ist, mit den "am meisten ein index pro table" - Regel.
Für SQL Server, meine Regel ist:
Suche nach der richtigen Mischung von Indizes - Wiegen die Vorteile der Beschleunigung der Abfragen gegen die Nachteile der zusätzliche Aufwand für INSERT -, UPDATE -, DELETE - ist keine exakte Wissenschaft - es geht eher darum, know-how, Erfahrung, Messung, Messung, und Messen Sie erneut.
Jede Feste Regel gebunden ist, werden mehr contraproductive als alles andere.....
Die besten Inhalte auf die Indizierung kommt von Kimberly Tripp - die Königin der Indizierung - finden Sie Ihre blog-Beiträge hier.
Wenn Sie sehr langsam liest, sollten Sie Indizes. Nicht über Bord gehen, aber nicht aus Angst vor Liberalen über Sie entweder. JEDER FK indiziert werden sollen. Du gehst zu tun eine look-up jede dieser Spalten auf Einsätze zu anderen Tabellen, um sicherzustellen, dass die Verweise gesetzt sind. Der index hilft. Ebenso wie die Tatsache, dass indizierte Spalten benutzt werden, oft in joins und selects.
Haben wir einige Tabellen eingefügt werden, selten, mit Millionen von Datensätzen. Einige dieser Tabellen sind auch ziemlich breit. Es ist nicht ungewöhnlich für diese Tabellen 15+ Indizes. Andere Tische mit schweren einfügen und niedrige liest, könnten wir nur eine Handvoll von Indizes - aber ein index pro Tabelle ist verrückt.
Aktualisierung eines index wird einmal pro Einsatz (pro index). Speed-Gewinn ist für jeden wählen. Also, wenn Sie aktualisieren Sie nur selten und oft gelesen, dann die zusätzliche Arbeit kann es Wert sein.
Wenn du anders machen, wählt (also die Spalten, die Sie filtern Verschieden sind), dann die Aufrechterhaltung eines index für jede Art der Abfrage ist sehr nützlich. Vorausgesetzt, Sie haben eine begrenzte Gruppe von Spalten, die die Abfrage oft.
Aber der übliche Rat gilt: wenn Sie wissen möchten, welche ist am schnellsten: Profil!
Sollten Sie natürlich vorsichtig sein, nicht zu viele Indizes pro Tabelle, aber immer nur mit einem einzigen index pro Tabelle ist nicht sinnvoll, Ebene.
Wie viele Indizes zu verwenden, hängt davon ab, wie die Tabelle verwendet wird. Eine Tabelle, die wird oft aktualisiert würden, haben in der Regel weniger Indizes als einer, der gelesen wird, viel mehr als oft es geht aktualisiert.
Haben wir einige Tabellen, die regelmäßig aktualisiert werden, indem ein job alle zwei Minuten, aber diese werden oft von Abfragen, die sehr unterschiedlich sind, so haben Sie mehrere Indizes. Eine Tabelle für Beispiel 24 Indizes.
So viel hängt von Ihrem schema und die Abfragen, die Sie normalerweise ausführen. Zum Beispiel: wenn Sie normalerweise brauchen, zu wählen über 60% der Zeilen der Tabelle, Indizes wird Ihnen nicht helfen, und es wird billiger sein, um beim Scannen der Tabelle als index-scan und anschließend die lookup-Zeilen. Konzentriert Abfragen, wählen Sie eine kleine Anzahl von Zeilen in die verschiedenen Teile der Tabelle oder die verwendet werden, für joins in Abfragen wird wahrscheinlich von Indizes profitieren. Die rechts-index an der richtigen Stelle kann Pause machen oder ein feature.
Indizes nehmen den Raum, so dass zu viele Indizes für eine Tabelle kann sich als kontraproduktiv für die gleichen oben genannten Gründen. Scannen 5 Indizes und dann Zeile lookups kann viel teurer sein als der einfach-Tabelle Scannen.
Gutes design ist die Synthese über ungefähr wissen, Wann zu normalisieren und Wann nicht.
Wenn Sie Häufig join auf eine bestimmte Spalte, überprüfen Sie die IO-plan mit dem index und ohne. Als Allgemeine Regel ich vermeiden, dass Tabellen mit mehr als 20 Spalten. Dies ist oft ein Zeichen dafür, dass die Daten normiert werden. Mehr als 5 Indizes auf eine Tabelle, und verwenden Sie möglicherweise mehr Raum für die Indizes als die Haupt-Tabelle, werden Sie sicher, dass ist es Wert. Diese Regeln sind nur die leichteste Führung und so viel hängt davon ab, wie die Daten in Abfragen verwendet werden, und was Ihre Daten aktualisieren Profil aussieht.
Experiment mit Ihrer Suchanfrage-Pläne zu sehen, wie die Lösung verbessert oder verschlechtert, mit einem index.
Jede Tabelle muss eine PK, die indiziert ist natürlich (in der Regel eine gruppierte ein), dann ist jede FK indiziert werden soll, wie gut.
Schließlich möchten Sie vielleicht indizieren Sie Felder, auf denen Sie oft Sortieren, , wenn Ihre Daten auch differenzierte: für ein Feld mit nur 5 möglichen Werte in eine Tabelle mit 1 Millionen Einträge, ein index wird nicht von großem nutzen.
Ich Neige dazu, minimalistischen Indizes, bis die db beginnt beeing gut gefüllt, und ...langsamer. Es ist leicht zu identifizieren, die Engpässe und fügen Sie einfach den richtigen Indizes zu diesem Punkt.
Optimierung der retrieval mit Indizes müssen sorgfältig entworfen, um die tatsächliche Abfrage-Muster. Sicherlich, für eine Tabelle mit Primärschlüssel, Sie haben mindestens einen gruppierten index (das ist, wie die Daten tatsächlich gespeichert sind), dann alle zusätzlichen Indizes nutzen das layout der Daten (Cluster-index).
Nach der Analyse von Abfragen, die gegen die Tabelle, die Sie möchten, um einen index entwerfen(s), die Sie bedecken. Das kann bedeuten, Bau eines oder mehrerer Indizes, aber das hängt stark von der Abfragen selbst. Diese Entscheidung kann nicht gemacht werden, einfach durch einen Blick auf Spalte nur die Statistiken.
Für Tabellen, bei denen es meistens die Einsätze, d.h. die ETL-Tabellen oder so etwas, dann sollten Sie nicht zu erstellen, Primärschlüssel, oder tatsächlich zu löschen Indizes und neu erstellen, wenn änderungen der Daten zu schnell oder drop/neu ganz.
Ich persönlich hätte Angst, den Schritt in eine Umgebung, hat eine hart codierte Regel von Indizes pro Tabelle-Verhältnis.