Aujourd'hui, sept bases de données en sept semaines m'ont présenté les index par opérateur.
Vous pouvez indexer des chaînes pour le modèle correspondant aux requêtes précédentes en créant un
text_pattern_ops
index de classe d'opérateur, tant que les valeurs sont indexées en minuscules.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Nous avons utilisé le
text_pattern_ops
car le titre est de type texte. Si vous avez besoin d'indexer Varchars, caractères, ou les noms, utilisez les opérations connexes:varchar_pattern_ops
,bpchar_pattern_ops
etname_pattern_ops
.
Je trouve l'exemple vraiment déroutant. Pourquoi est-il utile de faire cela?
Si la colonne est de type texte, les autres types (varchar, char, name) ne seraient-ils pas convertis en texte avant d'être utilisés comme valeur de recherche?
Comment cet index se comporte-t-il différemment de celui utilisant l'opérateur par défaut?
CREATE INDEX moves_title_pattern ON movies (lower(title));
la source
Réponses:
La documentation vous donne souvent une réponse à ces questions. Comme dans ce cas aussi:
La documentation poursuit en disant:
Vous pouvez vérifier vos paramètres régionaux comme suit (il s'agit probablement d'UTF8 plutôt que de "C"):
la source
text_pattern_ops
dépend de la localisation? Il semble que cela me serait bénéfique car mon environnement local est 'en_US.UTF-8' (pas 'C'), donc les requêtes de modèle ne peuvent pas utiliser l'index par défaut.LIKE
requête utilisant un index b-tree simple, la base de données doit utiliser lesC
paramètres régionaux. Ou l'index est défini avec leCOLLATE "POSIX"
(ouCOLLATE "C"
) et la requête spécifie une correspondanceCOLLATION
. Avec tout autre classement, l'ordre de l'index ne correspond pas aux règles de paramètres régionaux et ne peut donc pas être utilisé pour la correspondance de modèles.