<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>