Klawisze na VARCHAR
kolumny mogą być bardzo długie, co skutkuje mniejszą liczbą rekordów na stronę i większą głębią (więcej poziomów w B-Tree
). Dłuższe indeksy zwiększają również współczynnik braku pamięci podręcznej.
Ile łańcuchów w średniej jest odwzorowywane na każdą liczbę całkowitą?
Jeśli jest ich stosunkowo niewiele, możesz utworzyć indeks tylko na kolumnie liczb całkowitych i PostgreSQL
wykona dokładne filtrowanie rekordów:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Możesz również rozważyć utworzenie indeksu na hashach ciągu:
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żdy skrót to tylko 16
bajtów, więc klucze indeksu będą znacznie krótsze, zachowując niemal idealnie selektywność.