Ключове на VARCHAR
колоните могат да бъдат много дълги, което води до по-малко записи на страница и повече дълбочина (повече нива в B-Tree
). По-дългите индекси също увеличават коефициента на пропуски в кеша.
Колко низа в средната стойност съответстват на всяко цяло число?
Ако има сравнително малко, можете да създадете индекс само върху цяла колона и PostgreSQL
ще извърши финото филтриране на записите:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Можете също така да обмислите създаването на индекс върху хешовете на низовете:
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?
Всеки хеш е само 16
байта дълги, така че индексните ключове ще бъдат много по-къси, като същевременно запазват почти перфектно селективността.