Dzisiaj Siedem baz danych w siedmiu tygodniach zapoznało mnie z indeksami poszczególnych operatorów.
Możesz indeksować ciągi znaków dla wzorca pasującego do poprzednich zapytań, tworząc
text_pattern_ops
indeks klasy operatora, o ile wartości są indeksowane małymi literami.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Użyliśmy,
text_pattern_ops
ponieważ tytuł jest typu tekstowego. Jeśli trzeba indeks varchars, znaków lub nazw, użyj pokrewnych ops:varchar_pattern_ops
,bpchar_pattern_ops
, iname_pattern_ops
.
Uważam ten przykład za bardzo mylący. Dlaczego warto to zrobić?
Jeśli kolumna zawiera tekst, to czy inne typy (varchar, char, name) nie będą rzutowane na tekst przed użyciem jako wartości wyszukiwania?
Jak ten indeks zachowuje się inaczej niż indeks używający domyślnego operatora?
CREATE INDEX moves_title_pattern ON movies (lower(title));
postgresql
index
collation
pattern-matching
Iain Samuel McLean Elder
źródło
źródło
Odpowiedzi:
Dokumentacja często daje odpowiedź na takie pytania. Podobnie jak w tym przypadku :
Dokumentacja mówi dalej:
Możesz sprawdzić swoje ustawienia regionalne w następujący sposób (prawdopodobnie jest to UTF8 zamiast „C”):
źródło
text_pattern_ops
zależy od lokalizacji? Wygląda na to, że byłoby to dla mnie korzystne, ponieważ moje ustawienia regionalne to „en_US.UTF-8” (nie „C”), więc zapytania wzorców nie mogą używać domyślnego indeksu.LIKE
zapytanie przy użyciu zwykłego indeksu b-drzewa, to db musi używaćC
ustawień regionalnych. Lub indeks jest zdefiniowany za pomocąCOLLATE "POSIX"
(lubCOLLATE "C"
), a zapytanie określa dopasowanieCOLLATION
. W przypadku każdego innego sortowania kolejność indeksu nie jest zgodna z regułami ustawień regionalnych, a zatem nie można go używać do dopasowywania wzorców.