<p dir="ltr">No caso se email, poderia ser um index com as primeiras X posições. </p>
<p dir="ltr">Esse X poderia aumentar ou diminuir em relação a quantidade de registros. <br>
</p>
<div class="gmail_quote">On Sep 15, 2013 11:59 AM, "Eden Cardim" <<a href="mailto:eden@insoli.de">eden@insoli.de</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>>>>> "André" == André Walker <<a href="mailto:andre@andrewalker.net">andre@andrewalker.net</a>> writes:<br>
<br>
    André> Será que isso é realmente necessário? Quer dizer... qual o<br>
    André> problema de ter um índice no campo email mesmo? De qualquer<br>
    André> forma, você já vai ter um custo computacional na função md5<br>
    André> (ainda que pequeno), e tenho a impressão que índices em<br>
    André> campos texto não são tão ruins assim. Talvez varie de SGBD<br>
    André> pra SGBD? Em PostgreSQL, por exemplo, seria relevante ter<br>
    André> essa coluna email_md5?<br>
<br>
Imagino que isso seja um "mysqlianismo". No postgresql não precisa da<br>
coluna adicional, você pode criar um índice pré-computado:<br>
<br>
CREATE INDEX email_md5 ON test (md5(email));<br>
<br>
No meu teste rápido aqui, ficou mais lento usar md5, imagino que seja<br>
por conta do custo computacional de calcular o md5 pra toda consulta.<br>
Porque depois do cálculo, a comparação com o índice é efetivamente a<br>
mesma. Aliás, eu só vejo algum benefício potencial em usar md5 se a<br>
string resultante do md5 for *menor* que a maioria das strings de<br>
email, e não me parece que seja esse o caso. Mesmo assim, o postgresql<br>
usa o tamanho da string como otimização de busca. Quando você<br>
normaliza tudo pruma string md5 com o mesmo tamanho perde-se essa<br>
otimização. De qualquer forma, tá aí:<br>
<br>
edenc=# \d test<br>
          Table "public.test"<br>
 Column |       Type        | Modifiers<br>
--------+-------------------+-----------<br>
 email  | character varying | not null<br>
Indexes:<br>
    "test_pkey" PRIMARY KEY, btree (email)<br>
    "email_md5" btree (md5(email::text))<br>
<br>
edenc=# explain select email from test where email = 'c4ca4238a0b923820dcc509a6f75849b';<br>
                                QUERY PLAN<br>
--------------------------------------------------------------------------<br>
 Index Scan using test_pkey on test  (cost=0.00..8.54 rows=1 width=33)<br>
   Index Cond: ((email)::text = 'c4ca4238a0b923820dcc509a6f75849b'::text)<br>
(2 rows)<br>
<br>
edenc=# explain select email from test where md5(email) = md5('c4ca4238a0b923820dcc509a6f75849b');<br>
                                  QUERY PLAN<br>
-------------------------------------------------------------------------------<br>
 Index Scan using email_md5 on test  (cost=0.00..8.30 rows=1 width=33)<br>
   Index Cond: (md5((email)::text) = '28c8edde3d61a0411511d3b1866f0636'::text)<br>
(2 rows)<br>
<br>
<a href="https://gist.github.com/edenc/8ff84819c38bf19c3151" target="_blank">https://gist.github.com/edenc/8ff84819c38bf19c3151</a><br>
<br>
              Rate    MissMD5     HitMD5 MissNormal  HitNormal<br>
MissMD5    52165/s         --        -5%        -8%       -13%<br>
HitMD5     55157/s         6%         --        -3%        -8%<br>
MissNormal 56948/s         9%         3%         --        -5%<br>
HitNormal  59701/s        14%         8%         5%         --<br>
<br>
--<br>
Eden Cardim -- Insolide Soluções de TI Ltda.<br>
+55 11 9644 8225<br>
<a href="http://insoli.de" target="_blank">http://insoli.de</a><br>
=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</blockquote></div>