Knappar på VARCHAR
kolumner kan vara mycket långa vilket resulterar i färre poster per sida och mer djup (fler nivåer i B-Tree
). Längre index ökar också cachemissförhållandet.
Hur många strängar i genomsnitt mappar till varje heltal?
Om det är relativt få kan du skapa ett index endast på heltalskolumnen och PostgreSQL
kommer att göra finfiltreringen på poster:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Du kan också överväga att skapa indexet på stränghasharna:
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?
Varje hash är bara 16
byte långa, så indexnycklarna kommer att vara mycket kortare samtidigt som selektiviteten bevaras nästan perfekt.