PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQL-Indizierung auf varchar

Tasten auf VARCHAR Spalten können sehr lang sein, was zu weniger Datensätzen pro Seite und mehr Tiefe führt (mehr Ebenen im B-Tree ). Längere Indizes erhöhen auch die Cache-Miss-Rate.

Wie viele Strings sind durchschnittlich jeder Ganzzahl zugeordnet?

Wenn es relativ wenige sind, können Sie einen Index nur für die Ganzzahlspalte und PostgreSQL erstellen führt die Feinfilterung der Datensätze durch:

CREATE INDEX ix_mytable_assoc ON mytable (assoc);

SELECT  floatval
FROM    mytable
WHERE   assoc = givenint
        AND phrase = givenstring

Sie können auch erwägen, den Index auf den String-Hashes zu erstellen:

CREATE INDEX ix_mytable_md5 ON mytable (DECODE(MD5(phrase), 'HEX'));

SELECT  floatval
FROM    mytable
WHERE   DECODE(MD5(phrase), 'HEX') = DECODE(MD5('givenstring'), 'HEX')
        AND phrase = givenstring -- who knows when do we get a collision?

Jeder Hash ist nur 16 Bytes lang, so dass die Indexschlüssel viel kürzer sind, während die Selektivität immer noch fast perfekt erhalten bleibt.