Detaillierte Erläuterung der neuen relationalen Datenbankfunktionen in MySQL 8.0

Detaillierte Erläuterung der neuen relationalen Datenbankfunktionen in MySQL 8.0

Vorwort

Die neueste Version von MySQL 8.0 ist 8.0.4 rc und die offizielle Version wird voraussichtlich bald veröffentlicht. Dieser Artikel stellt mehrere wichtige neue Funktionen von 8.0 in relationalen Datenbanken vor.

Sie wissen vielleicht bereits, dass MySQL seit Version 5.7 NoSQL-Speicherfunktionen bietet, und diese Funktion wurde auch in 8.0 verbessert. Da dies in der Praxis jedoch selten verwendet wird und ich es nie verwendet habe, wird dieser Artikel diesen Aspekt nicht vorstellen, sondern sich auf den relationalen Datenbankaspekt konzentrieren.

1. Versteckter Index

Die Funktion für versteckte Indizes ist für die Leistungsfehlerbehebung sehr nützlich. In 8.0 können Indizes „ausgeblendet“ und „angezeigt“ werden. Wenn ein Index ausgeblendet ist, wird er vom Abfrageoptimierer nicht verwendet.

Das heißt, wir können einen Index ausblenden und dann die Auswirkungen auf die Datenbank beobachten. Wenn die Datenbankleistung nachgelassen hat, bedeutet dies, dass der Index nützlich ist und Sie ihn „zur Anzeige wiederherstellen“ können. Wenn sich die Datenbankleistung nicht geändert hat, bedeutet dies, dass der Index redundant ist und gelöscht werden kann.

Die Syntax zum Ausblenden eines Indexes lautet:

ALTER TABLE t ALTER INDEX i UNSICHTBAR;

Die Syntax zum Wiederherstellen des Indexes lautet:

ALTER TABLE t ALTER INDEX i SICHTBAR;

Wenn ein Index ausgeblendet ist, können wir aus der Ausgabe des Befehls „show index“ erkennen, dass der Sichtbar-Eigenschaftswert des Indexes „NO“ lautet.

Hinweis: Wenn ein Index ausgeblendet ist, wird sein Inhalt trotzdem wie bei einem normalen Index in Echtzeit aktualisiert. Diese Funktion dient speziell der Optimierung und Fehlerbehebung. Wenn Sie einen Index längere Zeit ausblenden, ist es besser, ihn zu löschen, da die Existenz des Indexes letztendlich die Leistung beim Einfügen, Aktualisieren und Löschen beeinträchtigt.

2. Persistenz festlegen

MySQL-Einstellungen können zur Laufzeit mit dem Befehl SET GLOBAL geändert werden, diese Änderung ist jedoch nur temporär und die Datenbank liest die Konfigurationsdatei beim nächsten Start erneut.

MySQL 8 fügt den Befehl SET PERSIST hinzu, zum Beispiel:

SETZEN SIE PERSIST max_verbindungen = 500;

MySQL speichert die Konfiguration dieses Befehls in der Datei mysqld-auto.cnf im Datenverzeichnis. Beim nächsten Start liest MySQL die Datei und überschreibt mit der darin enthaltenen Konfiguration die Standardkonfigurationsdatei.

3. UTF-8-Kodierung

Ab MySQL 8 wird die Standardkodierung der Datenbank auf utf8mb4 geändert, was alle Emoji-Zeichen einschließt. Viele Jahre lang waren wir bei der Kodierung bei der Verwendung von MySQL sehr vorsichtig, aus Angst, wir könnten vergessen, das lateinische Standardformat zu ändern und dadurch verstümmelte Zeichen entstehen. Ab sofort müssen Sie sich darüber keine Gedanken mehr machen.

4. Allgemeine Tabellenausdrücke

Komplexe Abfragen verwenden eingebettete Tabellen, zum Beispiel:

WÄHLEN Sie t1.*, t2.* VON 
 (WÄHLEN Sie Spalte1 aus Tabelle1) t1,
 (WÄHLEN Sie Spalte2 aus Tabelle2) t2;

Mit CTE können wir schreiben:

MIT
 t1 ALS (SELECT col1 FROM table1),
 t2 AS (WÄHLEN Sie Spalte2 AUS Tabelle2)
WÄHLEN Sie t1.*, t2.* 
VON t1, t2;

Auf diese Weise werden die Ebenen und Bereiche klarer dargestellt und Sie wissen genauer, welcher Teil geändert werden muss.

Ausführlichere Informationen zu CTE finden Sie in der offiziellen Dokumentation.

5. Fensterfunktionen

Eines der am häufigsten bemängelten Features von MySQL ist das Fehlen einer rank()-Funktion. Wenn Sie in einer Abfrage ein Ranking implementieren müssen, müssen Sie die @-Variable manuell schreiben. Ab 8.0 wurde MySQL jedoch ein neues Konzept namens Fensterfunktion hinzugefügt, mit dem mehrere neue Abfragemethoden implementiert werden können.

Fensterfunktionen ähneln ein wenig Aggregatfunktionen wie SUM() und COUNT(), sie fassen jedoch nicht mehrere Zeilen mit Abfrageergebnissen in einer Zeile zusammen, sondern ordnen die Ergebnisse wieder in mehreren Zeilen zu. Mit anderen Worten: Fensterfunktionen erfordern kein GROUP BY.

Angenommen, wir haben eine Tabelle mit der „Anzahl der Schüler in einer Klasse“:

mysql> wähle * aus Klassen;
+--------+-----------+
| Name | Anzahl der Stu-Anzahl |
+--------+-----------+
| Klasse 1 | 41 |
| Klasse 2 | 43 |
| Klasse 3 | 57 |
| Klasse 4 | 57 |
| Klasse 5 | 37 |
+--------+-----------+
5 Zeilen im Satz (0,00 Sek.)

Wenn ich die Klassengröße von klein nach groß einstufen möchte, kann ich die Fensterfunktion wie folgt verwenden:

mysql> select *, rank() über war `rank` aus Klassen
 -> Fenster war (Sortierung nach stu_count);
+--------+-----------+------+
| Name | stu_count | Rang |
+--------+-----------+------+
| Klasse 5 | 37 | 1 |
| Klasse 1 | 41 | 2 |
| Klasse 2 | 43 | 3 |
| Klasse 3 | 57 | 4 |
| Klasse 4 | 57 | 4 |
+--------+-----------+------+
5 Zeilen im Satz (0,00 Sek.)

Hier erstellen wir ein Fenster mit dem Namen w, geben es zum Sortieren des Felds stu_count an, führen dann die Methode rank() für w in der Select-Klausel aus und geben das Ergebnis als Rangfeld aus.

Tatsächlich ist die Erstellung eines Fensters optional. Wenn ich beispielsweise die Gesamtzahl der Studierenden in jeder Zeile hinzufügen möchte, kann ich Folgendes tun:

mysql> wähle *, Summe(stu_count) über() als total_count
 -> aus Klassen;
+--------+-----------+-------------+
| Name | stu_count | Gesamtanzahl |
+--------+-----------+-------------+
| Klasse 1 | 41 | 235 |
| Klasse 2 | 43 | 235 |
| Klasse 3 | 57 | 235 |
| Klasse 4 | 57 | 235 |
| Klasse 5 | 37 | 235 |
+--------+-----------+-------------+
5 Zeilen im Satz (0,00 Sek.)

Welchen Sinn hat das? Auf diese Weise können wir den Anteil der Schüler in jeder Klasse gleichzeitig ermitteln:

mysql> wähle *,
 -> (stu_count)/(Summe(stu_count) über()) als Rate
 -> aus Klassen;
+--------+-----------+--------+
| Name | stu_count | Bewertung |
+--------+-----------+--------+
| Klasse 1 | 41 | 0,1745 |
| Klasse 2 | 43 | 0,1830 |
| Klasse 3 | 57 | 0,2426 |
| Klasse 4 | 57 | 0,2426 |
| Klasse 5 | 37 | 0,1574 |
+--------+-----------+--------+
5 Zeilen im Satz (0,00 Sek.)

In der Vergangenheit konnte dies nur durch das Schreiben eines langen und undurchsichtigen Absatzes erreicht werden! Weitere Informationen zu Fensterfunktionen finden Sie hier.

Wie wäre es? Haben Sie nach dem Lesen der obigen Einführung weitere Erwartungen an MySQL 8.0?

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Neue Funktionen in MySQL 8.0 - Einführung in Check Constraints
  • Ausführliche Erläuterung versteckter Felder, einer neuen Funktion von MySQL 8.0
  • Implementierung von Check Constraints in MySQL 8.0
  • Analyse der neuen Funktionen von MySQL 8.0 - Transaktionales Datenwörterbuch und Atomic DDL
  • Neue Funktionen in MySQL 8.0: Hash Join
  • Eine kurze Diskussion über die Fallstricke und Lösungen der neuen Features von MySQL 8.0 (Zusammenfassung)
  • Neue Funktionen in MySQL 8.0: Unterstützung für atomare DDL-Anweisungen
  • Lösung für IDEA, das keine Verbindung zur MySQL-Portnummernbelegung herstellen kann
  • Verwenden Sie MySQL, um Port 3306 zu öffnen/ändern und Zugriffsberechtigungen in der Ubuntu/Linux-Umgebung zu öffnen
  • Perfekte Lösung für MySQL, das nach der Installation von phpstudy nicht gestartet werden kann (keine Notwendigkeit, die ursprüngliche Datenbank zu löschen, keine Notwendigkeit, eine Konfiguration zu ändern, keine Notwendigkeit, den Port zu ändern) direkte Koexistenz
  • Aktivieren Sie Remote-Zugriffsrechte für MySQL unter Linux und öffnen Sie Port 3306 in der Firewall
  • Neue Funktionen in MySQL 8.0 - Einführung in die Verwendung des Management-Ports

<<:  Vue implementiert 3 Möglichkeiten zum Wechseln zwischen Registerkarten und zum Beibehalten des Datenstatus

>>:  So löschen Sie den gesamten Inhalt eines Verzeichnisses mit Ansible

Artikel empfehlen

So entfernen Sie Wagenrücklaufzeichen aus Text in Linux

Machen Sie sich keine Sorgen, wenn Sie das Wagenr...

Fallstudie zu JavaScript-Funktionsaufrufen, Apply- und Bind-Methoden

Zusammenfassen 1. Ähnlichkeiten Beide können den ...

Füllen Sie die Suchfunktion auf der HTML-Seite aus

Ich habe kürzlich an einem Framework gearbeitet, ...

Tutorial zu XHTML-Webseiten

Dieser Artikel soll vor allem Anfängern einige gr...

So betten Sie Dateien im Flash-Videoformat (FLV, SWF) in HTML-Dateien ein

Flash-Dateiformate: .FLV und .SWF Für das Flash-Vi...

Verwenden Sie reines CSS, um einen Switch-Effekt zu erzielen

Zuerst ist die Idee Um diesen Effekt zu erzielen,...

Eine kurze Analyse der expliziten Typkonvertierung von MySQL

CAST-Funktion Im vorherigen Artikel haben wir die...

Einfache Implementierung von Mini-Vue-Rendering

Inhaltsverzeichnis Vorwort Ziel Erster Schritt: S...

Der Unterschied zwischen clientWidth, offsetWidth, scrollWidth in JavaScript

1. Konzept Sie alle sind Attribute des Elements u...

Detaillierte Schritte zum Einrichten des Hosts Nginx + Docker WordPress Mysql

Umfeld Linux 3.10.0-693.el7.x86_64 Docker-Version...