PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL LIKE wariacje wydajności zapytań

FTS nie obsługuje LIKE

Poprzednio zaakceptowana odpowiedź była nieprawidłowa. Wyszukiwanie pełnotekstowe z indeksami pełnotekstowymi nie dla LIKE w ogóle, ma swoje własne operatory i nie działa dla dowolnych ciągów. Działa na słowach w oparciu o słowniki i stemming. tak obsługuje dopasowywanie przedrostków dla słów , ale nie z LIKE operator:

  • Pobierz częściowe dopasowanie z kolumny TSVECTOR indeksowanej GIN

Indeksy trygramów dla LIKE

Zainstaluj dodatkowy moduł pg_trgm który zapewnia klasy operatorów dla indeksów trygramów GIN i GiST do obsługi wszystkich LIKE i ILIKE wzory , a nie tylko te zakotwiczone po lewej stronie:

Przykładowy indeks:

CREATE INDEX tbl_col_gin_trgm_idx  ON tbl USING gin  (col gin_trgm_ops);

Lub:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
  • Różnica między indeksem GiST i GIN

Przykładowe zapytanie:

SELECT * FROM tbl WHERE col LIKE '%foo%';   -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%';  -- works case insensitively as well

Trygramy? A co z krótszymi ciągami?

Słowa zawierające mniej niż 3 litery w wartościach indeksowanych nadal działa. Instrukcja:

Przy określaniu zestawu trygramów zawartych w łańcuchu uważa się, że każde słowo ma dwie spacje z przedrostkiem i jedną spację.

A wyszukiwać wzorce zawierające mniej niż 3 litery? Instrukcja:

Dla obu LIKE i wyszukiwania z użyciem wyrażeń regularnych, pamiętaj, że wzorzec bez możliwych do wyodrębnienia trygramów zdegeneruje się do pełnego skanu indeksu.

Oznacza to, że skanowanie indeksu / indeksu mapy bitowej nadal działa (plany zapytań dla przygotowanego zestawienia nie ulegną zerwaniu), po prostu nie zapewni lepszej wydajności. Zazwyczaj nie ma dużej straty, ponieważ ciągi 1- lub 2-literowe są mało selektywne (więcej niż kilka procent dopasowań tabeli bazowej), a obsługa indeksów nie poprawiłaby wydajności na początku, ponieważ pełne skanowanie tabeli jest szybsze.


text_pattern_ops do dopasowania prefiksu

Tylko zakotwiczone w lewo wzorce (bez wiodącego symbolu wieloznacznego) uzyskujesz optimum z odpowiednią klasą operatora dla indeksu btree:text_pattern_ops lub varchar_pattern_ops . Obie wbudowane funkcje standardowego Postgresa, nie są potrzebne żadne dodatkowe moduły. Podobna wydajność, ale znacznie mniejszy indeks.

Przykładowy indeks:

CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);

Przykładowe zapytanie:

SELECT * FROM tbl WHERE col LIKE 'foo%';  -- no leading wildcard

Lub , jeśli powinieneś uruchamiać swoją bazę danych z 'C' lokalizacja (właściwie nie locale), wtedy wszystko i tak jest sortowane według kolejności bajtów, a zwykły indeks btree z domyślną klasą operatora wykonuje zadanie.

Więcej szczegółów, wyjaśnień, przykładów i linków w tych powiązanych odpowiedziach na dba.SE:

  • Dopasowywanie wzorców za pomocą LIKE, SIMILAR TO lub wyrażeń regularnych w PostgreSQL
  • Jak wdrażane jest LIKE?
  • Szybkie znajdowanie podobnych ciągów za pomocą PostgreSQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakieś wady używania tekstu typu danych do przechowywania ciągów?

  2. Połącz zapytanie tylko z kolumnami, które mają wszystkie wartości w klauzuli `in`

  3. Jak uzyskać dane lokalne w bazie danych tylko do odczytu przy użyciu programu dplyr?

  4. Przełączanie projektu Django z backendu sqlite3 na postgresql kończy się niepowodzeniem podczas ładowania zrzutu danych

  5. Psycopg2 Wstaw do tabeli z symbolami zastępczymi