Indizierung jeder Spalte in einer Tabelle
Ich habe ein paar Fragen bezüglich MySQL-Indizierung:
1) gibt es eine Erhöhung der Geschwindigkeit bei der Indizierung einer Tabelle im Speicher abgelegt?
2) Bei der Suche meiner Tabelle, die ich auf passen, Spalte, Feld, würde die Indizierung jeder Spalte die Niederlage der Zweck eines index?
Vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Indizierung einer Tabelle, entweder Speicher-oder Dateisystem-basiert, beschleunigt Abfragen, auswählen oder Sortieren Sie Ergebnisse basierend auf dieser Spalte. Dies ist, weil der index funktioniert wie ein Baum-Struktur und die Suche Abstand hängt von der Tiefe des Baumes, die steigt viel langsamer als die Zeilenanzahl der Spalte (logarithmisch).
Indizierung jeder Spalte nicht die Niederlage der Zweck des index, aber es wird langsam bis inserts und updates, denn diese änderungen führen zu einer Aktualisierung von jedem index der Tabelle. Auch die Indizes nehmen Platz auf dem Datenbank-server, so dass ist ein weiterer Nachteil, der betrachtet werden.
Anderen Fragen zu Lesen in Bezug auf diese Frage:
Best practices für die Indizierung
Was ist ein index
Wie viele Indizes sind genug
1) ja, natürlich.
2) Nein, gibt es nicht die Niederlage der Zweck des index. Denken Sie daran, dass mysql nicht verwenden können, mehr als 1 index pro Tabelle und das hinzufügen weiterer Indizes Verlangsamungen insert/update/delete-Operationen. So vermeiden Sie das erstellen von Indizes, die nicht verwendet werden, erstellen Sie mehrspaltige Indizes, entspricht Ihre Anfragen am besten anstelle.
Die Kosten eines index-Speicherplatz ist in der Regel trivial. Die Kosten der zusätzlichen schreibt um den index zu aktualisieren, wenn änderungen an den Tabellen ist oft mäßig. Die Kosten, die die zusätzlichen sperren können schwerwiegend sein.
Kommt es auf das Lesen vs /schreib-Verhältnis auf dem Tisch, und wie oft der index tatsächlich verwendet wird, um die Geschwindigkeit einer Abfrage.
Indizes verwenden, bis der Speicherplatz auf der disc zu speichern, und die Zeit nehmen, zu erstellen und zu pflegen. Unbenutzter keine nutzen. Wenn es gibt eine Menge von Kandidaten-Indizes, die für eine Abfrage, die Abfrage kann verlangsamt werden, indem die server-wählen Sie die "falsche" one for the query.
Verwendung dieser Faktoren, um zu entscheiden, ob Sie einen index.
Gewöhnlich ist es möglich, erstellen Sie Indizes, die NIE verwendet werden - zum Beispiel, und den index auf ein (nicht null -) Feld mit nur zwei Werte möglich sind, ist fast sicher gehen, um zu werden, nutzlos.
Müssen Sie erklären, Ihre eigenen Anwendung Abfragen, um sicherzustellen, dass die Häufig durchgeführt werden sind mit sinnvollen Indizes, wenn möglich, und erstellen Sie nicht mehr Indizes als gefordert.
Können Sie mehr über den folgenden links: Für mysql: http://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL
Für DB2: http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005052.htm
Re Q1... Der Abfrageoptimierer manchmal wählt zum Scannen der Tabelle, auch wenn es eine "ganz gute" - index. Dieser Kompromiss basiert auf einem komplexen Algorithmus, aber als Faustregel gilt:
Wenn mehr als ~20% des index muss verwendet werden, es gilt als effizienter, ignorieren Sie den index und Scannen Sie einfach den Tisch.
Die Begründung ist: die Verwendung eines index-Scans die BTree-index (die sehr viel sieht aus wie eine Tabelle), springt dann über die data BTree finden Sie den Datensatz. Dieses hin-und-her ist zu vermeiden, wenn es scannt einfach die Daten. Der Nachteil ist, dass es braucht, zu ignorieren, bis zu 80% der Zeilen.
Logische Folge: nicht die Mühe, die Indizierung "flags" (0/1, T/F, M/F, ja/Nein) oder niedrige Kardinalität der Spalten (ja/Nein/vielleicht, M/F/usw, Tag-der-Woche, ...).
Auf der anderen Seite, kann es sehr nützlich sein, um eine composite index, beginnend mit einer niedrigen Kardinalität der Spalte: