Eine kurze Analyse der MySQL-Kardinalitätsstatistiken

Eine kurze Analyse der MySQL-Kardinalitätsstatistiken

1. Was ist die Kardinalität?
Mit Kardinalität wird die Anzahl der unterschiedlichen Werte in einer Spalte einer MySQL-Tabelle bezeichnet.

Wenn dieser Indextyp eindeutig ist, dann ist die Kardinalität = Anzahl der Zeilen.

Wenn diese Spalte das Geschlecht enthält und der Aufzählungstyp nur männlich und weiblich hat, dann ist ihre Kardinalität 2

Je höher die Kardinalität, desto wertvoller ist die Spalte für eine Indizierung. Der MySQL-Ausführungsplan wählt Indizes auch basierend auf der Kardinalität aus.

Die Kardinalität der einzelnen Spalten der Tabelle kann wie folgt angezeigt werden.

Nehmen wir dieses klassische Beispiel:
Es gibt eine Spalte namens „Geschlecht“. Die in der Spalte „Geschlecht“ gespeicherten Werte sind entweder männlich oder weiblich und ihre maximale Kardinalität beträgt 2.
Es ist nicht erforderlich, einen Index für das Geschlecht zu erstellen. Denn um Ihre geschlechtsspezifische Abfragegeschwindigkeit zu verbessern, erstellt MySQL einen brandneuen B+-Baum für den von Ihnen ausgewählten neuen Index. Aber Ihr Geschlecht hat nur zwei Werte. Bei MySQL wird, selbst wenn es einen B+Tree-Index für die von Ihnen angegebene Spalte erstellt, bei der tatsächlichen Ausführung der Abfrage höchstens eine binäre Abfrage ausgeführt, und die verbleibenden Vorgänge können nur Durchläufe sein, sodass es nicht sinnvoll ist, einen Index für das Geschlecht zu erstellen.

2. Wann aktualisiert InnoDB die Kardinalität?
Parameter: innodb_stats_auto_recalc steuert, ob MySQL diese persistenten Informationen aktiv neu berechnet. Der Standardwert ist 1 für „wahr“ und 0 für „falsch“.
Standardmäßig werden die Kardinalitätsinformationen neu berechnet, wenn sich die Zeilen in einer Tabelle um mehr als 10 % ändern.

3. Die Basiszahl wird geschätzt

Eine Aktualisierung der Basisnummer erfolgt nicht in Echtzeit! Und es handelt sich um einen durch Stichproben geschätzten Wert!

Die Formel für die Basis ist möglicherweise nicht wichtig.

Es ist wichtig zu wissen, dass es sich um eine Schätzung handelt, die durch die zufällige Auswahl von Datenseiten berechnet wird.

Und die Anzahl der zufällig ausgewählten Seiten kann durch den Parameter innodb_stats_persistent_sample_pages festgelegt werden, der Standardwert ist 20.

Dies bedeutet, dass der Basiswert nicht genau ist und auch die Ergebnisse Ihrer Berechnungen jedes Mal stark voneinander abweichen können.

4. Persistente Kardinalität

Mit dem Parameter innodb_stats_persistent können Sie steuern, ob die Kardinalität beibehalten wird. Die Standardeinstellung ist deaktiviert.

Natürlich können Sie STATS_PERSISTENT=1 für eine einzelne Tabelle festlegen und ihr innodb_stats_persistent wird automatisch aktiviert.

Der Vorteil der Aktivierung besteht darin, dass dieser Wert beim Neustart von MySQL nicht neu berechnet wird, was den Neustartvorgang beschleunigt.

5. Wie kann ich die Basis aktiv aktualisieren?

Durch Ausführen des folgenden SQL wird InnoDB dazu veranlasst, die Kardinalität zu aktualisieren (auch wenn Sie sich nicht darüber im Klaren sind, dass die Kardinalität aktualisiert wird).

Versuchen Sie also, eine Zeit mit geringer Geschäftsspitze zu wählen

Tabelle Tabellenname analysieren;

Wenn die Anzahl der Stichproben zu gering ist, wird die berechnete Kardinalität extrem falsch sein. Dies führt höchstwahrscheinlich dazu, dass der MySQL-Optimierer den falschen Index auswählt. Hier können Sie den Wert entsprechend erhöhen. Wenn Sie den Wert jedoch zu stark erhöhen, kann es sein, dass ANALYZE TABLE langsam ausgeführt wird.

Umgekehrt läuft ANALYZE TABLE zu langsam. Sie können den Wert des Parameters innodb_stats_persistent_sample_pages entsprechend anpassen. Dies kann jedoch zu einer ungenauen Kardinalitätsberechnung führen.

Wenn es keine Möglichkeit gibt, die Beziehung zwischen beiden im Gleichgewicht zu halten. Erwägen Sie, die Anzahl der indizierten Spalten in der Tabelle zu reduzieren oder die Anzahl der Partitionen zu begrenzen, um die Komplexität von ANALYZE TABLE zu verringern. Die Anzahl der Spalten im Primärschlüssel der Tabelle ist ebenfalls wichtig, da die Primärschlüsselspalten an jeden nicht eindeutigen Index angehängt werden.

siehe:

https://dev.mysql.com/doc/refman/5.7/en/innodb-persistent-stats.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-analyze-table-complexity.html

Oben finden Sie eine kurze Analyse der Details der MySQL-Kardinalitätsstatistik. Weitere Informationen zu MySQL-Kardinalitätsstatistiken finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space
  • Empfehlen Sie mehrere MySQL-bezogene Tools
  • Eine kurze Analyse der LRU-verknüpften Liste von MySQL
  • MySQL-Abfrage-Cache und Pufferpool
  • MySQL-Methode zum rekursiven Suchen nach allen untergeordneten Knoten eines Menüknotens
  • Was ist ein MySQL-Tablespace?
  • So finden Sie langsame MySQL-Abfragen
  • MySQL Flush-List und Flushing-Mechanismus für Dirty Pages

<<:  Detaillierte Erklärung des Fortschrittsbalkens beim Laden von Webseiten (empfohlen)

>>:  Lösung für das Problem des unzureichenden Speicherressourcenpools des Docker-Servers

Artikel empfehlen

Eine kurze Diskussion über JavaScript-Drosselung und Anti-Shake

Inhaltsverzeichnis Drosselung und Anti-Shake Konz...

960 Grid System – Grundprinzipien und Verwendung

Natürlich gibt es auch viele Leute, die die gegent...

Lösung für MySQL-Replikationsfehler aufgrund voller Festplatte

Inhaltsverzeichnis Fallbeispiel Lösung des Proble...

Ein tiefer Einblick in JavaScript-Promises

Inhaltsverzeichnis 1. Was ist Promise? 2. Warum g...

25 neue nützliche Icon-Sets zum Download im Ausland

1. E-Commerce-Symbole 2. Symbol Süßigkeiten 2 3. ...

Einführung in die Verwendung von Alt- und Titelattributen von HTML-Img-Tags

Wenn Browser-Anbieter die Standards umgehen und ei...

Wie oft werden mehrere setStates in React aufgerufen?

Inhaltsverzeichnis 1. Zwei setState, wie oft soll...

VUE implementiert einen Beispielcode für das Spiel Flappy Bird

Flappy Bird ist ein sehr einfaches kleines Spiel,...