MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

accélérer les recherches de texte générique

Le planificateur de requêtes PostgreSQL est intelligent, mais pas une IA. Pour lui faire utiliser un index sur une expression utiliser exactement la même forme d'expression dans la requête.

Avec un index comme celui-ci :

CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));

Ou plus simple dans PostgreSQL 9.1 :

CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));

Utilisez cette requête :

SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';

Qui est 100 % fonctionnellement équivalent à :

SELECT * FROM t WHERE lower(a) LIKE 'abcd%'

Ou :

SELECT * FROM t WHERE a ILIKE 'abcd%'

Mais pas :

SELECT * FROM t WHERE a LIKE 'abcd%'

Il s'agit d'une requête fonctionnellement différente et vous avez besoin d'un différent indice :

CREATE INDEX t_a_idx ON t (substring(a, 1, 4));

Ou plus simple avec PostgreSQL 9.1 :

CREATE INDEX t_a_idx ON t (left(a, 4));

Et utilisez cette requête :

SELECT * FROM t WHERE left(a, 4) = 'abcd';

Termes de recherche ancrés à gauche de longueur variable

Insensible à la casse. Indice :

Modifier :J'ai presque oublié :si vous exécutez votre base de données avec une autre locale que la valeur par défaut 'C', vous devez spécifiez explicitement la classe d'opérateur - text_pattern_ops dans mon exemple :

CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);

Requête :

SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';

Peut utiliser l'index et est presque aussi rapide que la variante à longueur fixe.

Vous pourriez être intéressé par ce post sur dba.SE avec plus de détails sur la correspondance de modèles , en particulier la dernière partie sur les opérateurs ~>=~ et ~<~ .