web-dev-qa-db-fra.com

Le type de données MYSQL JSON est-il mauvais pour la performance de la récupération de données?

Disons que j'ai un type de données MySQL JSON appelé custom_properties Pour une table multimédia:

enter image description here

Un exemple des données JSON stockées dans la colonne custom_properties Pourrait être la suivante:

{
 "company_id": 1, 
 "uploaded_by": "Name", 
 "document_type": "Policy", 
 "policy_signed_date": "04/04/2018"
}

Dans mon application PHP Laravel, je ferais quelque chose comme ça:

$media = Media::where('custom_properties->company_id', Auth::user()->company_id)->orderBy('created_at', 'DESC')->get();

Cela chercherait tous les éléments multimédias appartenant à la société 1.

Ma question est que cela permet de dire que nous disposons d'un million de documents multimédia, serait-ce une mauvaise façon d'aller chercher des dossiers en termes de performance? Quelqu'un peut-il perdre une lumière sur la manière dont MySQL Indexe les types de données JSON?

Du MySQL Docs officiels :

Les documents JSON stockés dans des colonnes JSON sont convertis en un format interne qui permet un accès rapide en lecture rapide aux éléments de document. Lorsque le serveur doit plus tard lire une valeur JSON stockée dans ce format binaire, la valeur ne doit pas être analysée à partir d'une représentation de texte. Le format binaire est structuré pour permettre au serveur de rechercher des sous-observations ou des valeurs imbriquées directement par l'index de clé ou de tableau sans lire toutes les valeurs avant ou après eux dans le document.

1
user3574492

Je pense que nous pouvons supposer en toute sécurité que la performance serait pire que d'utiliser des colonnes régulières.

Le moyen d'indexer les attributs JSON consiste à créer une colonne générée virtuelle pour l'attribut particulier que vous souhaitez (société_id), puis indexez la colonne virtuelle et utilisez cette colonne pour filtrer votre requête.

2
dbdemon