Kürzlich habe ich das Wunder der Indizes gelernt und die Leistung hat sich dramatisch verbessert. Nach allem, was ich gelernt habe, kann ich die Antwort auf diese Frage nicht finden.
Indizes sind großartig, aber warum konnte nicht jemand alle Felder indizieren, um die Tabelle unglaublich schnell zu machen? Ich bin sicher, es gibt einen guten Grund, dies nicht zu tun, aber wie wäre es mit drei Feldern in einer Tabelle mit dreißig Feldern? 10 in einem 30er Feld? Wo soll man die Grenze ziehen und warum?
Antworten:
Indizes belegen Speicherplatz (RAM); Zu viele oder zu große Indizes und die Datenbank müssen sie auf und von der Festplatte austauschen. Sie verlängern auch die Einfüge- und Löschzeit (jeder Index muss für jedes eingefügte / gelöschte / aktualisierte Datenelement aktualisiert werden).
Du hast kein unendliches Gedächtnis. Stellen Sie sicher, dass alle Indizes in den RAM passen = gut.
Du hast keine unendliche Zeit. Wenn Sie nur die Spalten indizieren, die Sie indizieren möchten, wird der Leistungseinbruch beim Einfügen / Löschen / Aktualisieren minimiert.
quelle
Beachten Sie, dass jeder Index jedes Mal aktualisiert werden muss, wenn eine Zeile aktualisiert, eingefügt oder gelöscht wird. Je mehr Indizes Sie haben, desto langsamer ist die Leistung für Schreibvorgänge.
Außerdem belegt jeder Index weiteren Speicherplatz und Speicherplatz (wenn er aufgerufen wird), sodass möglicherweise auch Lesevorgänge verlangsamt werden (bei großen Tabellen). Überprüfen Sie dies heraus
quelle
Sie müssen die CRUD-Bedürfnisse ausgleichen. Das Schreiben in Tabellen wird langsam. Wo die Linie gezogen werden soll, hängt davon ab, wie auf die Daten zugegriffen wird (Sortierfilterung usw.).
quelle
Die Indizierung beansprucht mehr zugewiesenen Speicherplatz sowohl vom Laufwerk als auch vom RAM, verbessert aber auch die Leistung erheblich. Wenn das Speicherlimit erreicht ist, gibt das System den Speicherplatz leider frei und gefährdet die Leistung. In der Praxis sollten Sie kein Feld indizieren, von dem Sie glauben, dass es keinen Datenüberquerungsalgorithmus enthält, weder das Einfügen noch das Suchen (WHERE-Klausel). Aber du solltest wenn anders. Standardmäßig müssen Sie alle Felder indizieren. Die Felder, die Sie als nicht indizierend betrachten sollten, sind, wenn die Abfragen nur vom Moderator verwendet werden, es sei denn, sie benötigen ebenfalls Geschwindigkeit
quelle
Diese Antwort basiert auf meiner persönlichen Meinung. Ich benutze meine mathematische Logik, um zu antworten
Die zweite Frage betraf die Grenze, an der angehalten werden soll. Lassen Sie uns zunächst eine mathematische Berechnung durchführen. Nehmen wir an, wir haben N Zeilen mit L Feldern in einer Tabelle. Wenn wir alle Felder indizieren, erhalten wir L neue Indextabellen, in denen jede Tabelle in a sortiert wird Sinnvolle Weise die Daten des Indexfeldes, auf den ersten Blick, wenn Ihre Tabelle ein W-Gewicht hat, wird es W * 2 (1 Tera wird 2 Tera), wenn Sie 100 große Tabellen haben (ich habe bereits in einem Projekt gearbeitet, in dem die Tabellennummer war um 1800 Tisch) verschwenden Sie 100-mal diesen Platz (100 Tera), dies ist alles andere als weise.
Wenn wir Indizes in allen Tabellen anwenden, müssen wir über Indexaktualisierungen nachdenken, wenn ein Update alle Indexaktualisierungen auslöst. Dies ist eine Auswahl aller ungeordneten Äquivalente in der Zeit
Daraus schließe ich, dass Sie in diesem Szenario haben, dass, wenn Sie diese Zeit verlieren, es vorzuziehen ist, sie in einer Auswahl oder einem Update zu verlieren, denn wenn Sie ein Feld auswählen, das nicht indiziert ist, werden Sie nicht für alle Felder eine weitere Auswahl auslösen nicht indiziert
was zu indizieren?
Fremdschlüssel: ist ein Muss basierend auf
Primärschlüssel: Ich bin mir noch nicht sicher, ob jemand, der dies liest, in diesem Fall helfen könnte
andere Felder: Die erste natürliche Antwort ist die Hälfte der verbleibenden Felder. Warum: Wenn Sie mehr indizieren sollten, sind Sie nicht weit von der besten Antwort entfernt. Wenn Sie weniger indizieren sollten, sind Sie auch nicht weit, weil wir wissen, dass kein Index schlecht und alle indiziert sind ist auch schlecht.
Aus diesen 3 Punkten kann ich schließen, dass wenn wir L Felder haben, die aus K Schlüsseln bestehen, die Grenze ungefähr
((L-K)/2)+K
mehr oder weniger bei L / 10 liegen sollteDiese Antwort basiert auf meiner Logik und meinen persönlichen Grundsätzen
quelle
Es ist keine gute Idee, alle Spalten in einer Tabelle zu indizieren. Dadurch wird das Lesen der Tabelle sehr schnell, das Schreiben wird jedoch auch viel langsamer. Wenn Sie in eine Tabelle schreiben, in der jede Spalte indiziert ist, müssen Sie den neuen Datensatz in diese Tabelle einfügen und dann die Informationen jeder Spalte in eine eigene Indextabelle einfügen.
quelle