sql >> Base de Datos >  >> NoSQL >> MongoDB

acelerar las búsquedas de texto comodín

El planificador de consultas de PostgreSQL es inteligente, pero no una IA. Para hacerlo, use un índice en una expresión use la exactamente la misma forma de expresión en la consulta.

Con un índice como este:

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

O más simple en PostgreSQL 9.1:

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

Utilice esta consulta:

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

Que es 100% funcionalmente equivalente a:

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

O:

SELECT * FROM t WHERE a ILIKE 'abcd%'

Pero no :

SELECT * FROM t WHERE a LIKE 'abcd%'

Esta es una consulta funcionalmente diferente y necesitas un diferente índice:

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

O más simple con PostgreSQL 9.1:

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

Y usa esta consulta:

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

Términos de búsqueda anclados a la izquierda de longitud variable

Insensible a mayúsculas y minúsculas. Índice:

Editar :Casi lo olvido:si ejecuta su base de datos con cualquier otra configuración regional que no sea la 'C' predeterminada, debe especifique la clase de operador explícitamente - text_pattern_ops en mi ejemplo:

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

Consulta:

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

Puede utilizar el índice y es casi tan rápido como la variante con una longitud fija.

Puede que le interese esta publicación en dba.SE con más detalles sobre la coincidencia de patrones , especialmente la última parte sobre los operadores ~>=~ y ~<~ .