PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres combinant plusieurs index

Je ne sais pas si Pg peut combiner un index GiST et des index b-tree réguliers avec une analyse d'index bitmap, mais je suppose que non. Vous pouvez obtenir le meilleur résultat possible sans ajouter de user_id colonne à votre index GiST (et par conséquent le rendant plus grand et plus lent pour les autres requêtes qui n'utilisent pas user_id ).

À titre expérimental, vous pourriez :

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

ce qui entraînera probablement un index volumineux, mais pourrait stimuler cette requête - si cela fonctionne. Soyez conscient que le maintien d'un tel index ralentira considérablement INSERT et UPDATE s. Si vous supprimez l'ancien ix_coords vos requêtes utiliseront ix_coords_and_user_id même s'ils ne filtrent pas sur user_id , mais ce sera plus lent que ix_coords . Garder les deux fera le INSERT et UPDATE ralentissement encore pire.

Voir btree-gist

(Obsolète par la modification d'une question qui change complètement la question ; lors de l'écriture, l'utilisateur avait un index multicolonne qu'il a maintenant divisé en deux index distincts ):

Vous ne semblez pas filtrer ou trier sur user_id , uniquement create_date . Pg n'utilisera pas (ne pourra pas ?) utiliser uniquement le deuxième terme d'un index multi-colonnes comme (user_id, create_date) , il doit également utiliser le premier élément.

Si vous souhaitez indexer create_date , créez un index distinct pour celui-ci. Si vous utilisez et avez besoin de (user_id, create_date) index et n'utilisent généralement pas uniquement user_id seul, voyez si vous pouvez inverser l'ordre des colonnes. Créez alternativement deux index indépendants, (user_id) et (create_date) . Lorsque les deux colonnes sont nécessaires, Pg peut combiner les deux index indépendants à l'aide d'un balayage d'index bitmap.