Arquivo de maio, 2010

Utilizando expressões regulares em pesquisas do MySQL

4 de maio de 2010

Muita gente realiza querys no MySQL, e as vezes, desconhece completamente do poder que certas consultas contém, na quantidade de dados e nos famosos “microsegundos“.

Mas porque isso? Vamos tomar um exemplo simples, eu tenho uma tabela com vários nomes, e gostaria de trazer apenas aqueles que começam com “Antonio“, normalmente você faria algo como o exibido abaixo:

1
select telefone from contatos where nome like '%Antônio'

Isso retornará o resultado que você espera claro, não haverá problemas na execução. Mas… e se uma consulta como essa, for realizada em alguma tabela que contenha uma quantidade muito grande de dados?

Entenda que um banco de dados não é uma estrutura que “sabe exatamente” onde um certo dado está, ele percorre linha a linha e reune os objetos encontrados seguindo os parâmetros dados por você. Quando você trabalha com uma quantidade muito grande de dados, e o obriga a percorrer essas linhas com consultas lentas, você atrasará outros processos para que seu resultado venha com maior precisão.

Ou seja, quando um Select muito longo é realizado, outras consultas como Insert, Update e Delete são impedidos, pois precisam aguardar a sua consulta. Já tive situações onde a linguagem de programação não suportou o tempo de espera trazendo a famosa mensagem “Fatal error: Maximum execution time exceeded“.

Então porque usar Expressões Regulares? É porque elas diminuem o tempo de sua consulta, pois com condições mais precisas, o MySQL descarta mais rápido atributos que não se enquadram na condição, aumentando o tempo de resposta. Consultar o nome do Antônio na base de dados, ficaria assim:

1
select telefone from contatos where nome regexp '^Antônio'

Vamos para algo mais complicado.

Situaçao: Um cliente lhe entrega uma base de dados que contém um acervo de artigos e matérias. Algumas dessas matérias lhe interessa para uma pesquisa pois possui uma data. O cliente não sabe que data é essa. Você então sugere em trazer todas as matérias que possuem datas, e o cliente concorda em olhar uma a uma até encontrar o que deseja.

E então, como você resolveria esse problema? Você não conseguiria usando o Like, a sua saída? Utilizando Expressão Regular, veja como ficaria a Query:

1
2
3
select id_textos from tabela where texto
regexp '^([1-9]|0[1-9]|[12][0-9]|3[01])\D([1-9]|
0[1-9]|1[012])\D(19[0-9][0-9]|20[0-9][0-9])$'

A expressão regular acima, procurará por datas que estejam no formato d/m/y. Você pode adaptar a expressão para aquilo que você deseja, retornando assim, uma pesquisa mais rápida e otimizada.

Para maiores informações consulte o manual de referência do MySQL, e se não entendeu muito o que botei neste post sobre Expressão Regular, é bom que comece a aprender, pois ela é muito importante, clique aqui para ter uma base.

Até o próximo post sobre otimização de banco de dados!

« voltar para a página principal do blog

© 2010 Foco Livre Ag. - Todos os direitos reservados. Powered by WordPress