In MySQL 5.7 wurde ein neuer Datentyp zum Speichern von JSON-Daten in MySQL- Tabellen hinzugefügt. Es wird offensichtlich eine große Veränderung in MySQL sein. Sie führten einige Vorteile auf
Dokumentvalidierung - In einer JSON-Spalte können nur gültige JSON-Dokumente gespeichert werden, sodass Sie eine automatische Validierung Ihrer Daten erhalten.
Effizienter Zugriff - Noch wichtiger ist, dass ein JSON-Dokument beim Speichern in einer JSON-Spalte nicht als Nur-Text-Wert gespeichert wird. Stattdessen wird es in einem optimierten Binärformat gespeichert, das einen schnelleren Zugriff auf Objektelemente und Array-Elemente ermöglicht.
Leistung - Verbessern Sie die Leistung Ihrer Abfrage, indem Sie Indizes für Werte in den JSON-Spalten erstellen. Dies kann mit „Funktionsindizes“ für virtuelle Spalten erreicht werden.
Komfort - Die zusätzliche Inline-Syntax für JSON-Spalten macht es sehr natürlich, Dokumentabfragen in Ihr SQL zu integrieren. Zum Beispiel (features.feature ist eine JSON-Spalte):
SELECT feature->"$.properties.STREET" AS property_street FROM features WHERE id = 121254;
WOW ! Sie enthalten einige großartige Funktionen. Jetzt ist es einfacher, Daten zu bearbeiten. Jetzt ist es möglich, komplexere Daten in Spalten zu speichern. So ist MySQL jetzt mit NoSQL gewürzt.
Jetzt kann ich mir eine Abfrage nach JSON-Daten vorstellen
SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN
(
SELECT JSON_EXTRACT(data,"$.inverted")
FROM t1 | {"series": 3, "inverted": 8}
WHERE JSON_EXTRACT(data,"$.inverted")<4 );
Kann ich also große kleine Beziehungen in wenigen json colum speichern? Ist es gut? Bricht es die Normalisierung? Wenn dies möglich ist, wird es sich vermutlich wie NoSQL in einer MySQL-Spalte verhalten . Ich möchte wirklich mehr über diese Funktion erfahren. Vor- und Nachteile des Datentyps MySQL JSON.
Now it is possible to store more complex data in column
. Seien Sie vorsichtigAntworten:
Die Verwendung einer Spalte in einem Ausdruck oder einer solchen Funktion beeinträchtigt die Wahrscheinlichkeit, dass die Abfrage mithilfe eines Index zur Optimierung der Abfrage verwendet wird. Die oben gezeigte Abfrage muss einen Tabellenscan durchführen.
Die Behauptung über "effizienten Zugang" ist irreführend. Dies bedeutet, dass die Abfrage, nachdem sie eine Zeile mit einem JSON-Dokument untersucht hat, ein Feld extrahieren kann, ohne den Text der JSON-Syntax analysieren zu müssen. Die Suche nach Zeilen erfordert jedoch immer noch einen Tabellenscan. Mit anderen Worten, die Abfrage muss jede Zeile untersuchen.
Wenn ich in einem Telefonbuch nach Personen mit dem Vornamen "Bill" suche, muss ich analog dazu immer noch jede Seite im Telefonbuch lesen, auch wenn die Vornamen hervorgehoben wurden, damit sie etwas schneller erkannt werden.
Mit MySQL 5.7 können Sie eine virtuelle Spalte in der Tabelle definieren und anschließend einen Index für die virtuelle Spalte erstellen.
Wenn Sie dann die virtuelle Spalte abfragen, kann sie den Index verwenden und den Tabellenscan vermeiden.
Das ist schön, aber es verfehlt den Sinn der Verwendung von JSON. Der attraktive Teil der Verwendung von JSON besteht darin, dass Sie neue Attribute hinzufügen können, ohne ALTER TABLE ausführen zu müssen. Es stellt sich jedoch heraus, dass Sie trotzdem eine zusätzliche (virtuelle) Spalte definieren müssen, wenn Sie JSON-Felder mithilfe eines Index durchsuchen möchten.
Sie müssen jedoch nicht für jedes Feld im JSON-Dokument virtuelle Spalten und Indizes definieren - nur für diejenigen, nach denen Sie suchen oder sortieren möchten. Es kann andere Attribute im JSON geben, die Sie nur in der Auswahlliste extrahieren müssen, wie die folgenden:
Ich würde allgemein sagen, dass dies der beste Weg ist, JSON in MySQL zu verwenden. Nur in der Auswahlliste.
Wenn Sie auf Spalten in anderen Klauseln verweisen (JOIN, WHERE, GROUP BY, HAVING, ORDER BY), ist es effizienter, herkömmliche Spalten zu verwenden, keine Felder in JSON-Dokumenten.
Ich habe auf der Percona Live-Konferenz im April 2018 einen Vortrag mit dem Titel " Verwendung von JSON in MySQL Wrong" gehalten. Ich werde den Vortrag im Herbst bei Oracle Code One aktualisieren und wiederholen.
Es gibt andere Probleme mit JSON. In meinen Tests war beispielsweise 2-3 Mal so viel Speicherplatz für JSON-Dokumente erforderlich wie für herkömmliche Spalten, in denen dieselben Daten gespeichert sind.
MySQL fördert seine neuen JSON-Funktionen aggressiv, um Menschen von einer Migration auf MongoDB abzubringen. Die dokumentenorientierte Datenspeicherung wie MongoDB ist jedoch grundsätzlich eine nicht relationale Methode zur Organisation von Daten. Es ist anders als relational. Ich sage nicht, dass eines besser ist als das andere, es ist nur eine andere Technik, die für verschiedene Arten von Abfragen geeignet ist.
Sie sollten JSON verwenden, wenn JSON Ihre Abfragen effizienter macht.
Wählen Sie keine Technologie, nur weil sie neu ist oder der Mode zuliebe.
Bearbeiten: Die Implementierung der virtuellen Spalte in MySQL soll den Index verwenden, wenn Ihre WHERE-Klausel genau den gleichen Ausdruck wie die Definition der virtuellen Spalte verwendet. Das heißt, im Folgenden sollte der Index für die virtuelle Spalte verwendet werden, da die virtuelle Spalte definiert ist
AS (JSON_EXTRACT(data,"$.series"))
Außer ich habe beim Testen dieser Funktion festgestellt, dass sie aus irgendeinem Grund NICHT funktioniert, wenn der Ausdruck eine JSON-Extraktionsfunktion ist. Es funktioniert für andere Arten von Ausdrücken, nur nicht für JSON-Funktionen.
quelle
JOIN
,WHERE
oder anderen Klauseln. Rufen Sie einfach die JSON-Spalte in der Auswahlliste ab.Das Folgende aus MySQL 5.7 bringt sexy zurück mit JSON klingt gut für mich:
...
Beachten Sie die Sprache zur Dokumentvalidierung, da dies ein wichtiger Faktor ist. Ich denke, für den Vergleich der beiden Ansätze muss eine Reihe von Tests durchgeführt werden. Diese beiden Wesen:
Das Netz hat ab sofort nur noch flache Slideshares zum Thema MySQL / JSON / Performance von dem, was ich sehe.
Vielleicht kann Ihr Beitrag ein Hub dafür sein. Oder vielleicht ist die Leistung ein nachträglicher Gedanke, nicht sicher, und Sie freuen sich nur darauf, keine Reihe von Tabellen zu erstellen.
quelle
[citation required]
haben Sie dieses Laufwerk mit dem RAM verglichen ?Ich bin kürzlich auf dieses Problem gestoßen und fasse die folgenden Erfahrungen zusammen:
1, Es gibt keine Möglichkeit, alle Fragen zu lösen. 2, Sie sollten den JSON richtig verwenden.
Ein Fall:
Ich habe eine Tabelle mit dem Namen :
CustomField
, und es müssen zwei Spalten sein:name
,fields
.name
ist eine lokalisierte Zeichenfolge, deren Inhalt wie folgt aussehen sollte:Und
fields
sollte so sein:Wie Sie sehen können, die beide
name
undfields
werden als JSON gespeichert, und es funktioniert!name
Was kann ich tun , wenn ich diese Tabelle häufig verwende? Verwenden Sie dieJSON_CONTAINS
,JSON_EXTRACT
...? Offensichtlich ist es keine gute Idee mehr, es als JSON zu speichern. Wir sollten es in einer unabhängigen Tabelle speichern :CustomFieldName
.Aus dem obigen Fall denke ich, dass Sie diese Ideen im Auge behalten sollten:
Vielen Dank
quelle
Nach meiner Erfahrung ist die JSON-Implementierung zumindest in MySql 5.7 aufgrund der schlechten Leistung nicht sehr nützlich. Nun, es ist nicht so schlecht für das Lesen von Daten und die Validierung. Die JSON-Modifikation ist mit MySql jedoch 10 bis 20 Mal langsamer als mit Python oder PHP. Stellen wir uns einen sehr einfachen JSON vor:
Nehmen wir an, wir müssen es in so etwas umwandeln:
Sie können mit Python oder PHP ein einfaches Skript erstellen, das alle Zeilen auswählt und einzeln aktualisiert. Sie sind nicht gezwungen, eine große Transaktion dafür durchzuführen, sodass andere Anwendungen die Tabelle parallel verwenden können. Natürlich können Sie auch eine große Transaktion durchführen, wenn Sie möchten, sodass Sie die Garantie erhalten, dass MySql "alles oder nichts" ausführt, aber andere Anwendungen können die Datenbank während der Transaktionsausführung höchstwahrscheinlich nicht verwenden.
Ich habe 40 Millionen Zeilen Tabelle, und Python-Skript aktualisiert es in 3-4 Stunden.
Jetzt haben wir MySql JSON, also brauchen wir kein Python oder PHP mehr, wir können so etwas tun:
Es sieht einfach und ausgezeichnet aus. Die Geschwindigkeit ist jedoch 10 bis 20 Mal langsamer als bei der Python-Version und es handelt sich um eine einzelne Transaktion, sodass andere Anwendungen die Tabellendaten nicht parallel ändern können.
Wenn wir also nur den JSON-Schlüssel in einer Tabelle mit 40 Millionen Zeilen duplizieren möchten, müssen wir die Tabelle 30-40 Stunden lang überhaupt nicht verwenden. Es hat keinen Sinn.
Über das Lesen von Daten ist meiner Erfahrung nach der direkte Zugriff auf das JSON-Feld über
JSON_EXTRACT
inWHERE
auch extrem langsam (viel langsamer alsTEXT
bei einerLIKE
nicht indizierten Spalte). Virtuell generierte Spalten arbeiten viel schneller. Wenn wir jedoch unsere Datenstruktur im Voraus kennen, benötigen wir kein JSON, sondern können stattdessen herkömmliche Spalten verwenden. Wenn wir JSON dort verwenden, wo es wirklich nützlich ist, dh wenn die Datenstruktur unbekannt ist oder sich häufig ändert (z. B. benutzerdefinierte Plugin-Einstellungen), ist die regelmäßige Erstellung virtueller Spalten für mögliche neue Spalten keine gute Idee.Python und PHP machen die JSON-Validierung zu einem Zauber, daher ist es fraglich, ob wir überhaupt eine JSON-Validierung auf MySQL-Seite benötigen. Warum nicht auch XML, Microsoft Office-Dokumente validieren oder die Rechtschreibung überprüfen? ;)
quelle