Donnerstag, Februar 27, 2020

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.

InformationsquelleAutor Linus Norton | 2010-07-09

4 Kommentare

  1. 20

    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

    • Eine Faustregel: Die fan-out für MySQL BTrees ist 100. Also, eine Tabelle oder einen index mit einem _billion_rows benötigen ein Baum Tiefe von etwa 5.
  2. 2

    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.

    • Ich glaube, MySQL, als der 5.0, ist in der Lage, mehr als einen index pro Tabelle. Es ist nicht so effizient wie ein einzelner index auf die gleichen Spalten, aber es ist oft besser als ein full table scan.
  3. 0

    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

  4. 0

    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:

    WHERE deleted=0 AND created_at > NOW() - INTERVAL 1 DAY
    INDEX(deleted, created_at)

Kostenlose Online-Tests