Heim  >  Artikel  >  Datenbank  >  Neue Funktionen von MySQL 5.7 |. Json-Spalte und generierte Spalte (Teil 2)

Neue Funktionen von MySQL 5.7 |. Json-Spalte und generierte Spalte (Teil 2)

黄舟
黄舟Original
2017-02-07 13:14:022049Durchsuche

Der JSON-Feldtyp hat in der aktuellen Version keinen Index, daher ist das Hinzufügen, Löschen, Ändern und Überprüfen von JSON-Feldern sehr schlecht und im Grunde unbrauchbar basiert darauf. MySQL5.7 bietet einen generierten Feldtyp, der im Internet als generierte Spalte oder berechnete Spalte bezeichnet wird. Lassen Sie uns zunächst verstehen, was eine generierte Spalte ist.

1. Einführung in die generierte Spalte

Generierte Spalte ist eine neue Funktion, die in MySQL 5.7.6 eingeführt wurde. Die sogenannte Cenerated Column bedeutet, dass diese Spalte in der Datenbank aus anderen Spalten berechnet wird. Zitieren Sie zur Veranschaulichung ein Beispiel aus dem offiziellen Referenzhandbuch:

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
mysql> SELECT * FROM triangle;
+-------+-------+--------------------+
| sidea | sideb | sidec              |
+-------+-------+--------------------+
|     1 |     1 | 1.4142135623730951 |
|     3 |     4 |                  5 |
|     6 |     8 |                 10 |
+-------+-------+--------------------+

Es gibt zwei Arten von generierten Spalten, nämlich virtuell generierte Spalten und gespeicherte generierte Spalten. Ersteres speichert nur generierte Spalten im Datenwörterbuch (Metadaten). der Tabelle) speichert diese Datenspalte nicht auf der Festplatte; letztere speichert die generierte Spalte auf der Festplatte, anstatt sie jedes Mal zu berechnen, wenn sie gelesen wird. Letzteres speichert offensichtlich Daten, die aus vorhandenen Daten berechnet werden können, erfordert mehr Speicherplatz und hat keinen Vorteil gegenüber der virtuellen Spalte. Daher ist in MySQL 5.7 der Typ der generierten Spalte nicht angegeben und der Standardwert ist „Virtual Column“. Obwohl im Allgemeinen eine virtuelle generierte Spalte verwendet werden sollte, gibt es derzeit viele Einschränkungen bei der Verwendung einer virtuellen generierten Spalte: Sie kann nicht als Primärschlüssel verwendet werden, kann nicht als Primärschlüssel verwendet werden, kann keine Volltextindizes und räumlichen Indizes erstellen usw. Es kann jedoch sein, dass es in späteren Versionen unterstützt wird. Wenn Sie Generated Column-Felder für die Indizierung verwenden, sollten Sie Stored Generated Column verwenden. Wenn Sie Generated Column für die Indizierung verwenden, besteht die offizielle Lösung für die Indizierung von JSON-Feldern darin, Stored Generated Column zu verwenden. Die Anweisung zur Tabellenerstellung mithilfe der gespeicherten generierten Spalte lautet wie folgt, es wird lediglich ein Wort hinzugefügt:

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb) STORED)
);

2. Hinweise zur generierten Spalte

Generierte Spalte kann nicht geschrieben werden, sie wird automatisch generiert, wenn Beim Erstellen müssen Sie prüfen, ob die Berechnungsformel dieser Spalte angemessen ist. Wenn sie erstellt wird, wird kein Fehler gemeldet. Beim Einfügen eines Werts wird jedoch ein Fehler gemeldet, wenn die generierte Spalte verwendet wird on führt beim Löschen zu einem Fehler und muss zuerst gelöscht werden. Die generierte Spalte kann dann die Spalten löschen, von denen sie abhängt. Wenn wir die generierte Spalte beispielsweise als „x-Spalte + y-Spalte“ definieren, ist dies der Fall Es ist offensichtlich, dass sowohl die x-Spalte als auch die y-Spalte numerisch sind. Wenn wir die x-Spalte definieren oder die y-Spalte als Zeichentyp definieren, wird ein Fehler erwartet, aber tatsächlich können wir ihn normal erstellen, aber ein Beim Einfügen wird ein Fehler gemeldet.

Neue Funktionen von MySQL 5.7 |. Json-Spalte und generierte Spalte (Teil 2)

3. Verwenden Sie die generierte Spalte, um einen Index zum JSON-Feld hinzuzufügen

Normalerweise scannen Abfragen im Zusammenhang mit dem JSON-Feld die gesamte Tabelle, da das JSON-Feld selbst Wenn der Index nicht erstellt werden kann, verwenden wir die Funktion „Generierte Spalte“, um Spalten für die relevanten Schlüssel im JSON-Feld als generierte Spalte zu generieren, und indizieren dann die generierte Spalte:

ALTER TABLE json_test ADD COLUMN age INT AS 
(JSON_EXTRACT(user_info,'$.age')) STORED,
 ADD KEY idx_age (age);

Der Vorher-Nachher-Vergleich lautet wie folgt:

Neue Funktionen von MySQL 5.7 |. Json-Spalte und generierte Spalte (Teil 2)

Neue Funktionen von MySQL 5.7 |. Json-Spalte und generierte Spalte (Teil 2)

Es ist deutlich zu erkennen, dass nach der Verwendung der generierten Spalte und dem Hinzufügen eines Index der Index zum Abfragen verwendet wird Wert im JSON-Feld.

Fazit

Das Aufkommen von Generated Column und JSON Column in MySQL 5.7 hat es in einigen Szenarien möglich gemacht, NoSQL wie MongoDB zu ersetzen, obwohl dies insgesamt nicht der Fall war Die von MongoDB und anderen erstellten Methoden sind sehr leistungsstark, aber ich glaube, dass es in Zukunft immer mehr Szenarien geben wird, in denen diese beiden Typen zum Einsatz kommen. Gleichzeitig werden die Herausforderungen für Datenbankadministratoren größer Das Geschäft vom Typ JSON wird mit unabhängigen MySQL-Instanzen ausgeführt, um zu verhindern, dass JSON zu einem großen Feld wird (die Größe der im JSON-Dokument gespeicherten JSON-Spalte ist auf den Wert der Systemvariablen max_allowed_packet beschränkt). Dies hat Auswirkungen auf andere Vorgänge .

Das Obige ist der Inhalt der neuen Funktionen von MySQL 5.7 | Json Column und Generated Column (Teil 2). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn