it-swarm.com.de

MySQL - Warum nicht jedes Feld indizieren?

Ich habe kürzlich das Wunder der Indizes kennen gelernt und die Leistung hat sich dramatisch verbessert. Nach allem, was ich gelernt habe, scheint ich keine Antwort auf diese Frage zu finden.

Indizes sind großartig, aber warum kann jemand nicht einfach alle Felder indizieren, um die Tabelle unglaublich schnell zu machen? Ich bin sicher, dass es einen guten Grund gibt, dies nicht zu tun, aber wie wäre es mit drei Feldern in einer Tabelle mit dreißig Feldern? 10 in einem 30 Feld? Wo soll man die Grenze ziehen und warum?

79
Vael Victus

Indizes belegen Speicherplatz (RAM); Zu viele oder zu große Indizes, und die Datenbank muss sie auf die Festplatte und von der Festplatte austauschen. Sie erhöhen auch die Einfüge- und Löschzeit (jeder Index muss für jede eingefügte/gelöschte/aktualisierte Datei aktualisiert werden). 

Du hast kein unendliches Gedächtnis. Damit alle Indizes in RAM = gut passen.

Du hast keine unendliche Zeit. Indizieren Sie nur die Spalten, die Sie indizieren möchten, wird der Performance-Treffer beim Einfügen/Löschen/Aktualisieren minimiert.

93
Brian Roach

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 beansprucht jeder Index mehr Speicherplatz und Speicherplatz (wenn er aufgerufen wird). Daher könnte er möglicherweise auch Lesevorgänge verlangsamen (für große Tabellen) . Check out

19
AndyMac

Sie müssen die CRUD-Bedürfnisse ausgleichen. Das Schreiben auf Tabellen wird langsam. Wo die Linie gezeichnet wird, hängt davon ab, wie die Daten abgerufen werden (Sortierfilter usw.).

9
Smandoli

Indizierung beansprucht mehr Speicherplatz von Laufwerk und RAM, verbessert jedoch auch die Leistung erheblich. Wenn das Speicherlimit erreicht ist, gibt das System den Speicherplatz frei und riskiert die Leistung. Praktisch sollten Sie kein Feld indizieren, von dem Sie annehmen, dass es keinen Datenalgorithmus für Daten enthält, weder Einfügen noch Suchen (WHERE-Klausel). Sie sollten aber anders sein. Standardmäßig müssen Sie alle Felder indizieren. Die Felder, deren Deaktivierung in Betracht gezogen werden sollte, sind, wenn die Abfragen nur vom Moderator verwendet werden, es sei denn, sie benötigen auch Geschwindigkeit

1
Lionel Jerinho

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 eine L neue Indextabelle, in der jede Tabelle in a sortiert Sinnvolle Weise die Daten des Indexfeldes, auf den ersten Blick, wenn Ihre Tabelle ein W-Gewicht ist, wird es W * 2 (1 Tera wird 2 Tera), wenn Sie 100 große Tabelle haben (ich habe bereits in einem Projekt gearbeitet, in dem die Tabellennummer war Um 1800 Tisch) werden Sie 100 Mal diesen Raum (100 Tera) verschwenden, das ist alles andere als klug.

Wenn wir Indizes in allen Tabellen anwenden, müssen wir über Indexaktualisierungen nachdenken, wenn eine Aktualisierung alle Indizes auslöst

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 keine weitere Auswahl für alle Felder auslösen, die sind nicht indiziert

was soll indiziert werden?

fremdschlüssel: ist ein Muss basierend auf

primärschlüssel: Ich bin mir noch nicht sicher, ob jemand, der dies liest, in diesem Fall Abhilfe schaffen 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, da wir wissen, dass kein Index schlecht und alle indiziert ist ist auch schlecht.

aus diesen 3 Punkten kann ich schließen, dass, wenn wir L Felder haben, die aus K Schlüsseln zusammengesetzt sind, die Grenze ungefähr in der Nähe von ((L-K)/2)+K ungefähr bei L/10 liegen sollte

diese Antwort basiert auf meiner Logik und meinen persönlichen Vorgaben

Es ist keine gute Idee, alle Spalten einer Tabelle zu indizieren. Dadurch kann die Tabelle zwar sehr schnell gelesen werden, es wird jedoch auch viel langsamer beschrieben. Wenn Sie in eine Tabelle schreiben, für die jede Spalte indiziert ist, müssen Sie den neuen Datensatz in diese Tabelle einfügen und dann die Informationen jeder Spalte in ihre eigene Indextabelle aufnehmen.

0
Rachid Sakara