Coelho Dizeres Computador
[X] Fechar

Já conhece a NewsLetter do CoelhoDePrograma? Clique aqui e assine!

Só demora 30 segundos para se cadastrar e você recebe nossas notícias por email!

Seu nome:

Seu email:

Nome do amigo:

Email do amigo:

Usando SQL_CALC_FOUND_ROWS no MySQL



segunda-feira, 16 de setembro de 2013 - 08:48
Banco de dados - voc est implantando isso errado!Fala, galera! O papo de hoje sobre banco de dados, mais especificamente sobre MySQL, um banco de dados que apesar de free, bem poderoso, sobretudo pra quem precisa de banco de dados e tem um oramento apertado. Basta dizer que ele atendeu ao SuperVasco enquanto eu estive frente do site, que chega a ter 1000 usurios online por minuto vrias vezes por dia.

Bom, todo desenvolvedor web j fez uma pgina de consulta, n? Aquele velho esquema: Lista das ocorrncias retornadas, separadas em pginas de, digamos, 20 ocorrncias por pgina e o velho link pra navegar entre as pginas. Na navegao voc tem que informar que o usurio est na pgina 1 de 8. Pra isso, obviamente voc vai ter que saber quantos registros no total satisfizeram a condio de busca informada pelo usurio. Quem j mexeu com BD sabe que isso se faz usando um s.elect count, certo? Certo, mas no MySQL tem um jeito melhor de fazer. Vamos a um exemplo prtico pra facilitar o entendimento:

Se voc quer deixar seu usurio pesquisar exatamente pela palavra intervalado no seu banco de dados, far algo como:
s.elect datMateria, strTituloMateria, strTextoMateria from matrias where strTextoMateria like %intervalado% order by datMateria desc limit 0, 20.

Pra saber quantas ocorrncias houve no total, voc far algo como:
s.elect count(lngCodMateria) from matrias where strTextoMateria like %intervalado%

Qual o problema nessa abordagem? Como voc quer que o usurio ache a palavra intervalado, usar obrigatoriamente a clusula like, que varre a tabela de matrias inteira. Duas vezes, como diria Chuck Norris... Uma vez para obter os dados e outra para o total. E isso, pra maior tabela do seu site que sucesso de crtica e de pblico como era o SuperVasco, pode ser um desastre em termos de performance. A vem a dica de hoje.

O s.elect do MySQL tem uma clusula SQL_CALC_FOUND_ROWS, que calcula quantas linhas foram retornadas, independente de voc ter usado ou no o limit. Imediatamente depois deve ser usado o comando "s.elect FOUND_ROWS()", que a, sim, retorna o nmero total de registros retornados, mas sem varrer novamente a tabela! TRUCO!

No conheo a arquitetura do banco, mas imagino que o MySQL deva acrescentar mais uma coluna escondida s retornadas pelo seu s.elect, coluna cujo valor v ser retornado no s.elect FOUND_ROWS().

Isso, em conjunto com outra clusula legal do MySQL, o SQL_CACHE, que eu detalharei em outra ocasio, podem dar uma bela desengargalada nos acessos a banco de dados do seu site.

Como diria meu primo Pernalonga, Thats all, folks! At a prxima! :-)

Fonte: Coelho de Programa

Leia mais sobre: sql_calc_found_rows, mysql

Assine a NewsLetter do CoelhoDePrograma e não perca mais nenhum artigo!

Gostou da matéria? Comente logo abaixo! mrgreen

Copyright - Marcelo Coelho