Многостолбцовый индекс SQL не работает с LIKE-запросами - PullRequest
0 голосов
/ 18 декабря 2018

Рассматривая таблицу, как показано ниже

CREATE TABLE test (
    "a" varchar(32),
    "b" varchar(32),
    "c" varchar(32),
    "d" varchar(32)
);
CREATE INDEX  "test_index" ON test USING btree("a", "b", "c");

Мне нужно выполнить запросы, такие как

SELECT count(*) 
FROM test 
WHERE a like 'a%' 
and b = 'b' 
and c = 'c'

Результат EXPLAIN показан ниже

Aggregate  (cost=10.36..10.37 rows=1 width=0)
  ->  Index Only Scan using test_index on test  (cost=0.14..10.36 rows=1 width=0)
        Index Cond: ((b = 'b'::text) AND (c = 'c'::text))
        Filter: ((a)::text ~~ 'a%'::text)

На основе EXPLAINВ результате Postgres только b и c используют индекс.Кажется, LIKE 'a%' работает только с одним столбцом индекса.

Итак, как увеличить скорость запроса для вышеупомянутого запроса?

1 Ответ

0 голосов
/ 18 декабря 2018

Идеальный индекс для этого запроса:

CREATE INDEX ON test (b, c, a varchar_pattern_ops);

Вам необходимо varchar_pattern_ops для условия LIKE, если в столбце не используется сопоставление C (или эквивалентно POSIX).Запустите SHOW lc_collate;, чтобы увидеть параметры сортировки по умолчанию.

Ваш индекс, вероятно, не может использоваться, потому что вы используете другой порядок сортировки.Кроме того, условия LIKE вызывают сканирование диапазона индекса, и все столбцы с условием равенства должны находиться в индексе перед столбцом с сканированием диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...