Sleutels op VARCHAR
kolommen kunnen erg lang zijn, wat resulteert in minder records per pagina en meer diepte (meer niveaus in de B-Tree
). Langere indexen verhogen ook de cache miss-ratio.
Hoeveel strings worden gemiddeld toegewezen aan elk geheel getal?
Als er relatief weinig zijn, kunt u alleen een index maken op de integer-kolom en PostgreSQL
zal de fijne filtering op records doen:
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
U kunt ook overwegen om de index op de string-hashes te maken:
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?
Elke hash is slechts 16
bytes lang, dus de indexsleutels zullen veel korter zijn terwijl de selectiviteit bijna perfect behouden blijft.