sql >> Database teknologi >  >> RDS >> PostgreSQL

Er der en nyttig måde at indeksere en tekstkolonne, der indeholder regex-mønstre?

Der er ingen måde .

Indekser kræver IMMUTABLE udtryk. Resultatet af dit udtryk afhænger af inputstrengen. Jeg kan ikke se nogen anden måde end at evaluere udtrykket for hver række, hvilket betyder en sekventiel scanning.

Relateret svar med flere detaljer for IMMUTABLE vinkel:

Bare at der ikke er nogen løsning for din sag, hvilket er umuligt at indeksere. Indekset skal gemme konstante værdier i sine tuples, hvilket bare ikke er tilgængeligt, fordi den resulterende værdi for hver række beregnes baseret på inputtet. Og du kan ikke transformere inputtet uden at se på kolonneværdien.

Postgres indeksbrug er bundet til operatorer og kun indekser på udtryk venstre af operatøren kan bruges (på grund af de samme logiske begrænsninger). Mere:

Mange operatører definerer en COMMUTATOR som tillader forespørgselsplanlæggeren/optimeringsværktøjet at vende de indekserede udtryk til venstre. Simpelt eksempel:Kommutatoren for = er = . kommutatoren for > er < og omvendt. Dokumentationen:

Det regulære udtryk matchoperator ~ har ingen kommutator igen, for det er ikke muligt. Se selv:

SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM   pg_operator
WHERE  oprname = '~'
AND    'text'::regtype IN (oprright, oprleft);

 oprname | oprright |  oprleft  | oprcom
---------+----------+-----------+------------
 ~       | text     | name      | 0
 ~       | text     | text      | 0
 ~       | text     | character | 0
 ~       | text     | citext    | 0

Og se manualen her:

Jeg har prøvet før og måtte acceptere, at det er umuligt af princippet .




  1. Skal jeg undslippe en forventet heltalsværdi ved hjælp af mysql_real_escape_string, eller kan jeg bare bruge (int)$expectedinteger

  2. MySQL på dubletnøgleopdatering

  3. Sideinddeling med OFFSET / FETCH:En bedre måde

  4. Hvad er den bedste måde at tælle sidevisninger på i PHP/MySQL?