Hoy Seven Databases en Seven Weeks me presentó los índices por operador.
Puede indexar cadenas para patrones que coincidan con las consultas anteriores creando un
text_pattern_ops
índice de clase de operador, siempre que los valores se indexen en minúsculas.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Usamos el
text_pattern_ops
porque el título es de tipo texto. Si necesita índice varchars, caracteres, o nombres, utilice las operaciones relacionadas:varchar_pattern_ops
,bpchar_pattern_ops
, yname_pattern_ops
.
El ejemplo me parece realmente confuso. ¿Por qué es útil hacer esto?
Si la columna es texto de tipo, ¿los otros tipos (varchar, char, name) no se convertirán en texto antes de usarse como valor de búsqueda?
¿Cómo se comporta ese índice de manera diferente al que usa el operador predeterminado?
CREATE INDEX moves_title_pattern ON movies (lower(title));
fuente
Respuestas:
La documentación a menudo le da una respuesta a tales preguntas. Como en este caso , también:
La documentación continúa diciendo:
Puede verificar su configuración regional de la siguiente manera (es probable que sea UTF8 en lugar de "C"):
fuente
text_pattern_ops
depende de la configuración regional? Parece que me beneficiaría porque mi configuración regional es 'en_US.UTF-8' (no 'C'), por lo que las consultas de patrones no pueden usar el índice predeterminado.LIKE
consulta usando un índice b-tree simple, entonces el db debe estar usando laC
configuración regional. O el índice se define conCOLLATE "POSIX"
(oCOLLATE "C"
) y la consulta especifica una coincidenciaCOLLATION
. Con cualquier otra clasificación, el orden del índice no coincide con las reglas locales y, por lo tanto, no se puede utilizar para la coincidencia de patrones.