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!


