Maison  >  Article  >  base de données  >  Nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (Partie 2)

Nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (Partie 2)

黄舟
黄舟original
2017-02-07 13:14:022049parcourir

Le type de champ JSON n'a pas d'index dans la version actuelle, il est donc très terrible en production. L'efficacité de l'ajout, de la suppression, de la modification et de la vérification des champs JSON peut être imaginable, et c'est fondamentalement inutilisable. est basé sur cela. MySQL5.7 fournit un type de champ généré, appelé colonne générée ou colonne calculée sur Internet. Comprenons d'abord ce qu'est la colonne générée.

1. Introduction à la colonne générée

La colonne générée est une nouvelle fonctionnalité introduite dans MySQL 5.7.6. La colonne générée signifie que cette colonne de la base de données est calculée à partir d'autres colonnes. Pour illustrer, citons un exemple du manuel de référence officiel :

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 |
+-------+-------+--------------------+

Il existe deux types de colonne générée, à savoir la colonne générée virtuelle et la colonne générée stockée. La première enregistre uniquement la colonne générée dans le dictionnaire de données (métadonnées). du tableau), ne conservera pas cette colonne de données sur le disque ; ce dernier conservera la colonne générée sur le disque au lieu de la calculer à chaque lecture. Évidemment, cette dernière stocke des données qui peuvent être calculées à partir de données existantes, nécessite plus d'espace disque et n'a aucun avantage par rapport à la colonne virtuelle. Par conséquent, dans MySQL 5.7, le type de colonne générée n'est pas spécifié et la valeur par défaut est la colonne virtuelle. Bien que la colonne générée virtuelle doive généralement être utilisée, il existe actuellement de nombreuses restrictions sur l'utilisation de la colonne générée virtuelle : elle ne peut pas être utilisée comme clé primaire, ne peut pas être utilisée comme clé primaire, ne peut pas créer d'index de texte intégral et d'index spatiaux, etc. mais il peut être pris en charge dans les versions ultérieures. Par conséquent, si vous utilisez des champs de colonne générée pour l'indexation, vous devez utiliser une colonne générée stockée. Lorsque vous utilisez une colonne générée pour l'indexation, la solution officielle pour l'indexation de champs JSON consiste à utiliser une colonne générée stockée. L'instruction de création de table à l'aide de la colonne générée stockée est la suivante, en ajoutant simplement un mot :

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

2 Notes sur la colonne générée

La colonne générée ne peut pas être écrite, elle est automatiquement générée lorsque ; lors de la création, vous devez déterminer si la formule de calcul de cette colonne est raisonnable. Si elle est déraisonnable, une erreur ne sera pas signalée lors de sa création, mais une erreur sera signalée lors de l'insertion d'une valeur lors de son utilisation des colonnes dont dépend la colonne générée ; on provoquera une erreur lors de la suppression et doit d'abord être supprimé. La colonne générée peut ensuite supprimer les colonnes dont elle dépend ; la définition de la colonne générée est illégale. Par exemple, si nous définissons la colonne générée comme "colonne x et colonne y", elle sera activée. est évident que la colonne x ou la colonne y sont toutes deux numériques. Si nous définissons la colonne x ou la colonne Si la colonne y est définie (ou modifiée) comme type de caractère, une erreur est attendue, mais en fait nous pouvons la créer normalement, mais une erreur. sera signalé lors de l’insertion.

Nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (Partie 2)

3. Utilisez la colonne générée pour ajouter un index au champ JSON

Normalement, les requêtes liées au champ JSON analysent la table entière car le champ JSON lui-même Si l'index ne peut pas être créé, nous utilisons la fonctionnalité de colonne générée pour générer des colonnes pour les clés pertinentes dans le champ JSON en tant que colonne générée, puis indexons la colonne générée :

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

La comparaison avant et après est le suivant :

Nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (Partie 2)

Nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (Partie 2)

On voit clairement qu'après avoir utilisé la colonne générée et ajouté un index, l'index est utilisé pour interroger le valeur dans le champ JSON.

Conclusion

L'émergence des colonnes générées et des colonnes JSON dans MySQL 5.7 a permis de remplacer NoSQL tel que MongoDB dans certains scénarios, même si globalement cela n'a pas été fait par MongoDB et d'autres est si puissant, mais je pense qu'il y aura de plus en plus de scénarios dans lesquels ces deux types seront utilisés à l'avenir. En même temps, les défis pour les administrateurs de base de données deviendront également plus grands. Les activités de type JSON seront exécutées à l'aide d'instances MySQL indépendantes pour éviter que JSON ne devienne un champ volumineux (la taille de la colonne JSON stockée dans le document JSON est limitée à la valeur de la variable système max_allowed_packet). Cela a un impact sur les autres opérations. .

Ce qui précède est le contenu des nouvelles fonctionnalités de MySQL 5.7 | Colonne Json et colonne générée (partie 2) Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn