[SP-pm] DBIx::Class

Eden Cardim eden at insoli.de
Sun Sep 15 07:58:47 PDT 2013


>>>>> "André" == André Walker <andre em andrewalker.net> writes:

    André> Será que isso é realmente necessário? Quer dizer... qual o
    André> problema de ter um índice no campo email mesmo? De qualquer
    André> forma, você já vai ter um custo computacional na função md5
    André> (ainda que pequeno), e tenho a impressão que índices em
    André> campos texto não são tão ruins assim. Talvez varie de SGBD
    André> pra SGBD? Em PostgreSQL, por exemplo, seria relevante ter
    André> essa coluna email_md5?

Imagino que isso seja um "mysqlianismo". No postgresql não precisa da
coluna adicional, você pode criar um índice pré-computado:

CREATE INDEX email_md5 ON test (md5(email));

No meu teste rápido aqui, ficou mais lento usar md5, imagino que seja
por conta do custo computacional de calcular o md5 pra toda consulta.
Porque depois do cálculo, a comparação com o índice é efetivamente a
mesma. Aliás, eu só vejo algum benefício potencial em usar md5 se a
string resultante do md5 for *menor* que a maioria das strings de
email, e não me parece que seja esse o caso. Mesmo assim, o postgresql
usa o tamanho da string como otimização de busca. Quando você
normaliza tudo pruma string md5 com o mesmo tamanho perde-se essa
otimização. De qualquer forma, tá aí:

edenc=# \d test
          Table "public.test"
 Column |       Type        | Modifiers 
--------+-------------------+-----------
 email  | character varying | not null
Indexes:
    "test_pkey" PRIMARY KEY, btree (email)
    "email_md5" btree (md5(email::text))

edenc=# explain select email from test where email = 'c4ca4238a0b923820dcc509a6f75849b';                                                                                             
                                QUERY PLAN                                
--------------------------------------------------------------------------
 Index Scan using test_pkey on test  (cost=0.00..8.54 rows=1 width=33)
   Index Cond: ((email)::text = 'c4ca4238a0b923820dcc509a6f75849b'::text)
(2 rows)

edenc=# explain select email from test where md5(email) = md5('c4ca4238a0b923820dcc509a6f75849b');                                                                                  
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Index Scan using email_md5 on test  (cost=0.00..8.30 rows=1 width=33)
   Index Cond: (md5((email)::text) = '28c8edde3d61a0411511d3b1866f0636'::text)
(2 rows)

https://gist.github.com/edenc/8ff84819c38bf19c3151

              Rate    MissMD5     HitMD5 MissNormal  HitNormal
MissMD5    52165/s         --        -5%        -8%       -13%
HitMD5     55157/s         6%         --        -3%        -8%
MissNormal 56948/s         9%         3%         --        -5%
HitNormal  59701/s        14%         8%         5%         --

-- 
Eden Cardim -- Insolide Soluções de TI Ltda.
+55 11 9644 8225
http://insoli.de


More information about the SaoPaulo-pm mailing list