Ключи в столбцах 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
байт, поэтому индексные ключи будут намного короче, при этом сохраняя избирательность почти идеально.