Сегодня « Семь баз данных за семь недель» познакомили меня с индексами для каждого оператора.
Вы можете индексировать строки для шаблона, соответствующего предыдущим запросам, создав
text_pattern_ops
индекс класса оператора, если значения индексируются в нижнем регистре.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Мы использовали,
text_pattern_ops
потому что заголовок имеет тип текста. Если вам нужно индексировать VARCHARS, символы или названий, используйте соответствующий оп:varchar_pattern_ops
,bpchar_pattern_ops
, иname_pattern_ops
.
Я нахожу пример действительно запутанным. Почему это полезно?
Если столбец имеет тип text, не будут ли другие типы (varchar, char, name) преобразованы в текст перед использованием в качестве значения для поиска?
Как этот индекс ведет себя иначе, чем индекс, использующий оператор по умолчанию?
CREATE INDEX moves_title_pattern ON movies (lower(title));
источник
Ответы:
Документация часто дает вам ответ на такие вопросы. Как и в этом случае тоже:
Документация продолжает говорить:
Вы можете проверить свою локаль следующим образом (скорее всего, это будет UTF8, а не «C»):
источник
text_pattern_ops
зависит от локали? Похоже, это принесет мне пользу, потому что моя локаль 'en_US.UTF-8' (не 'C'), поэтому запросы шаблонов не могут использовать индекс по умолчанию.LIKE
запрос с использованием простого индекса b-дерева, то база данных должна использоватьC
локаль. Или индекс определяется с помощьюCOLLATE "POSIX"
(илиCOLLATE "C"
), а в запросе указывается соответствиеCOLLATION
. При любом другом сопоставлении порядок индекса не соответствует правилам локали и поэтому не может использоваться для сопоставления с образцом.