2016-07-05 10 views
1

Wie werden doppelte Schlüssel in InnoDBs Implementierung von B + Baum für seine Indizes behandelt.InnoDB B + Baumindex - doppelte Werte

Zum Beispiel, wenn es eine Tabelle mit 1 Million Zeilen mit einer Kardinalität von 10 gibt. Wenn wir einen Index für diese Spalte erstellen, wie würde dann der resultierende B + Baum aussehen?

Wird es nur 10 Schlüssel haben und der Wert jedes Schlüssels ist die Liste der Primärschlüssel, die zu diesem Schlüssel gehören (wenn ja, in welcher Struktur? Verknüpfte Liste?) Oder wird es 1M Schlüssel haben (wenn ja, dann B + Baum müsste anders behandelt werden)?

Antwort

2

In gewisser Hinsicht hat ein InnoDB BTree keine Duplikate. Dies liegt daran, dass die Spalten PRIMARY KEY an die für einen Sekundärschlüssel angegebenen Spalten angehängt werden. Das führt zu einer vollständig geordneten Liste.

Wenn Sie über einen Sekundärschlüssel (oder den Anfangsteil eines Schlüssels) suchen, wird die Abfrage den BTree aufschlüsseln, um die erste Zeile im Index zu finden, die Ihren Angaben entspricht, und dann vorwärts scannen, um andere zu erhalten. Um den Rest der Spalten zu erhalten, braucht man die PRIMARY KEY Spalten, um eine zweite BTree-Suche durchzuführen.

Der Optimierer wird selten einen Index mit "geringer Kardinalität" verwenden. Zum Beispiel sollte eine Ja/Nein- oder Wahr/Falsch- oder Männlich/Weiblich-Spalte nicht indiziert werden. Der Optimizer würde es schneller finden, die Tabelle einfach zu scannen, anstatt zwischen dem Index und (über die PK-Spalten) den Haupt-BTree hin- und herzublättern.

Der Cutoff für die Verwendung des Index im Vergleich zum Stochern beträgt etwa 20%, abhängig von der Mondphase.

+0

Danke Rick. Das scheint einen Sinn zu ergeben. Haben Sie irgendwelche Hinweise - im Handbuch oder woanders? – Vikk

+0

Ach, nein. Es gibt viele Webseiten in der Dokumentation, aber sie sind in der Regel präziser und weniger praktisch. Dies ist Teil meines gesammelten Wissens darüber, wie die Indexierung funktioniert. Ich versuche es auf eine "brauchbare" Weise umzuformulieren. Ich habe wiederholt die 20% (10% bis 30%) nachgewiesen. 5.7 hat das "Kostenmodell" für die Entscheidung über den Abfrageplan neu gestaltet, läuft aber immer noch auf das hinaus, was ich gesagt habe. –

1

Bad Index

Der Fall, dass Sie vorschlagen, für einen B + Baum ein schlechtes ist. Eine Kardinalität von 10 bedeutet only 10 of the 1 million values are unique. Eigentlich ist es nicht nur schlecht für einen B + Baum, es ist generell ein schlechter Index. Basierend auf diesem Index werden Sie im Durchschnitt mit einer Untermenge von ca. 100.000 Werte, die Sie entweder durchsehen oder einen anderen Wert verwenden müssen, um weiter zu filtern.

B + Baum Eigenschaften

die Struktur des resultierenden Baum Bezüglich gibt es einige Dinge im Auge zu behalten hier:

  1. Ein Knoten kann nicht beliebig viele Daten enthalten.
  • Einsätze können Splits erfordern, wenn der Blattknoten
  • Gelegentlich wird die Aufteilung eines Blattknotens erfordert Spaltung des nächsthöheren Knoten
  • Im schlimmsten Fall voll ist die Spaltung der alle Kaskade kann up Weg zu dem Wurzelknoten

https://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-

  1. Blätter sind als doppelt verkettete Liste verknüpft.
  • Blattknoten werden zusammen als doppelt verknüpfte Liste verknüpft
  • [...]
  • gesamten Baum auf allen
die höheren Knoten abgetastet werden kann

https://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-

ohne den Besuch

Erwartung

Wenn Sie viele Daten mit Schlüsseln einfügen, die mehr oder weniger alle zur selben Äquivalenzklasse gehören, würde ich einen Baum erwarten, der nicht viel hilft. Die 10 Schlüssel sind möglicherweise nur im Stammknoten vorhanden, und alle tieferen Daten im Baum werden nur unsortiert (da nichts mehr übrig ist, um sie zu sortieren).

Aufgrund der Tatsache, dass die Blätter doppelt verknüpfte Listen sind, sind Sie im Wesentlichen mit dem, was ich am Anfang geschrieben habe: Sie müssen eine große Teilmenge der Werte durchlaufen.Bezüglich des gegebenen Indexes musste dies erwartet werden und der B + Baum könnte sich angesichts der Umstände gut entwickeln (eine Liste ist in Ordnung, um alle Daten durchzugehen).

Eigentlich geht das eine Abstraktion tiefer: Die Blätter sind doppelt verknüpft, aber es gibt mehrere Werte in jedem Blatt (Daten oder Link zu PK). Trotzdem sind diese auch in einer Liste, wenn Sie also einfach alles durchqueren, macht das keinen großen Unterschied.

Prüfungs InnoDB Raum

Bitte beachten Sie, dass Sie auch untersuchen können, was MySQL ist wirklich zu bauen. Es gibt Werkzeuge, die integrierten Indexdatenstrukturen zu überprüfen, siehe zum Beispiel

+0

Ich weiß, es ist ein schlechter Index. Es ist nur für mein Verständnis von Innodb Internals. Es tut uns leid, aber Ihre Antwort ist nicht wirklich klar darüber, wie diese Daten in der Baumstruktur gespeichert werden. Ich werde die Tools in Links versuchen. Vielen Dank. – Vikk

+0

Vielleicht sollten Sie nur die zwei Links lesen, die ich zur Verfügung gestellt habe, und auch das MySQL-Handbuch dazu. Es gibt (oder war zumindest) ein Kapitel im Handbuch, das die MySQL-Interna anspricht, vielleicht auch, wenn das für Sie von Interesse ist (vielleicht schauen Sie sich das Handbuch für ältere Versionen an). – GhostGambler

1

speichern InnoDB Tabelle in B + Baum-Index intern PRIMARY genannt. Der Schlüssel des Indexes sind Ihre primären Schlüsselfelder.

Wenn Sie einen sekundären Index definieren, gibt es einen zusätzlichen B + Baumindex (in .ibd oder ibdata1), wobei der Schlüssel die sekundären Indexfelder und value der Primärschlüssel ist.

B + tree selbst benötigt keinen Schlüssel, um eindeutig zu sein. Die Eindeutigkeit von PRIMARY- und allen UNIQUE-Indizes wird auf Serverebene erzwungen.

Hier finden Sie einige Folien darüber, wie InnoDB Indizes organisiert und diese für den Zugriff auf die Daten verwendet. http://www.slideshare.net/akuzminsky/efficient-indexes-in-mysql#downloads-panel