sql >> Database >  >> RDS >> PostgreSQL

SQL-indexering op varchar

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.



  1. Vind datumhiaten met mysql

  2. Waarom kan ik psycopg2 niet installeren? (Python 2.6.4, PostgreSQL 8.4, OS X 10.6.3)

  3. Subquery met Bestaat 1 of Bestaat *

  4. MYSQL selecteert willekeurig van elk van de categorieën