Clés sur VARCHAR
les colonnes peuvent être très longues, ce qui entraîne moins d'enregistrements par page et plus de profondeur (plus de niveaux dans le B-Tree
). Des index plus longs augmentent également le taux d'échec du cache.
Combien de chaînes correspondent en moyenne à chaque entier ?
S'il y en a relativement peu, vous pouvez créer un index uniquement sur la colonne entière et PostgreSQL
effectuera le filtrage fin sur les enregistrements :
CREATE INDEX ix_mytable_assoc ON mytable (assoc);
SELECT floatval
FROM mytable
WHERE assoc = givenint
AND phrase = givenstring
Vous pouvez également envisager de créer l'index sur les hachages de chaîne :
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?
Chaque hachage est seulement 16
octets de long, donc les clés d'index seront beaucoup plus courtes tout en préservant presque parfaitement la sélectivité.