Afin d'optimiser la recherche d'éléments spécifiques dans un tableau JSON, veillez à prendre en compte la version de PostgreSQL et la structure des données.
Dans PostgreSQL 9.4 et versions ultérieures, le type de données binaire JSON jsonb
offre des capacités d'indexation considérablement améliorées. Vous pouvez créer un index GIN directement sur le tableau jsonb
:
CREATE TABLE tracks (id serial, artists jsonb); -- ! CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
Cet index permet des requêtes efficaces utilisant l'opérateur @>
:
SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
Alternativement, vous pouvez utiliser la classe d'opérateur jsonb_path_ops
GIN spécialisée :
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists jsonb_path_ops); -- !
L'instruction de requête reste inchangée.
Pour PostgreSQL 9.3, pensez à utiliser une fonction IMMUTABLE
pour extraire les éléments d'un tableau JSON dans un tableau de valeurs texte :
CREATE OR REPLACE FUNCTION json2arr(_j json, _key text) RETURNS text[] LANGUAGE sql IMMUTABLE AS 'SELECT ARRAY(SELECT elem->>_key FROM json_array_elements(_j) elem)';
Ensuite, créez un index GIN fonctionnel sur le tableau extrait :
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (json2arr(artists, 'name'));
Dans les requêtes, utilisez des opérateurs de tableau pour faire correspondre les expressions d'index :
SELECT * FROM tracks WHERE '{"The Dirty Heads"}'::text[] <@ (json2arr(artists, 'name'));
Veuillez noter que l'indexation des fonctions ne peut être utilisée qu'avec les fonctions IMMUTABLE
. Validez la mutabilité de la fonction json_array_elements()
et de toute autre fonction JSON utilisée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!