Klávesy na VARCHAR
sloupce mohou být velmi dlouhé, což má za následek méně záznamů na stránku a větší hloubku (více úrovní v B-Tree
). Delší indexy také zvyšují poměr vynechání mezipaměti.
Kolik řetězců v průměru mapuje každé celé číslo?
Pokud je jich relativně málo, můžete vytvořit index pouze na celočíselném sloupci a PostgreSQL
provede jemné filtrování záznamů:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Můžete také zvážit vytvoření indexu pro hash řetězce:
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?
Každý hash je pouze 16
bajtů, takže indexové klíče budou mnohem kratší, přičemž si stále téměř dokonale zachovají selektivitu.