Quanto mais veloz for seu site, mais satisfeito seu usuário ficará – e pode acabar se tornando um fiel cliente.
Velocidade de carregamento é fundamental em qualquer site. E é o critério que mais pesa nas avaliações feitas por usuários. Afinal, ninguém poderá avaliar o design do site ou seu conteúdo antes de ele carregar complemente.
O grande problema é que muitos desenvolvedores focam muito em design e em conteúdo, deixando o desempenho em segundo plano. Muitas vezes, perdem alguns segundos de carregamento em prol de um efeito visual.
Pesquisas realizadas pela Akamai e pela Gomez.com apontam que, para cada segundo que o usuário espera pelo carregamento de uma página, a satisfação dele com o site decai em 16%. Segundo eles, os usuários esperam que os sites carreguem em 2 segundos ou menos, sendo que eles abandonariam páginas que levassem mais de 3 segundos para carregar.
Essa mesma pesquisa concluiu que 79% dos clientes que tiveram problemas com o desempenho de um site não voltariam a fazer negócio. E 44% deles contariam aos amigos sobre a má experiência. Por isso, o tempo de carregamento das páginas é extremamente importante. Pode ser uma das chaves para seu negócio dar certo de verdade e atrair clientes.
Pense que seu visitante é um potencial cliente fiel, que voltará inúmeras vezes ao seu site. Mas ele só fará isso se o site for rápido e confiável.
Por isso 20
1. Modele corretamente o banco de dados
Esta primeira dica parece bem óbvia, mas o fato é que a maioria dos problemas com desempenho são devido à modelagem errada dos bancos de dados.
Um simples exemplo, que vejo com muita frequência, é salvar diversas informações, como dados pessoais e financeiros, na mesma coluna de uma tabela. Outro exemplo é salvar em um único campo os valores selecionados em checkboxes. Alguns programadores pegam todos os valores e os armazenam separados por vírgula em um único campo. Quando o usuário decide atualizar ou remover uma opção, o programador deve escrever linhas e mais linhas para separar os valores, comparar e depois unir de novo.
Modelagem errada prejudica o banco de dados, o programador, que precisará escrever mais códigos, e, principalmente, o desempenho da aplicação, que precisará processar todo esse código em excesso.
Modelagem de dados é a primeira fase do desenvolvimento. Estruture bem seu banco de dados, antes mesmo de começar a escrever seus códigos.
2. Não execute consultas dentro de loops
O velho problema do N + 1.
Imagine esta situação: um site de artigos, com uma tabela de usuários e outra de artigos, que possui um campo que relaciona o artigo com seu autor.
Se precisar listar os autores e os títulos de seus respectivos artigos, alguns programadores fariam o seguinte:
- Selecionar todos os usuários: SELECT id, nome FROM usuarios;
- Para cada usuário, buscar seus posts: SELECT titulo FROM posts WHERE user_id = id_do_usuario;
A segunda consulta seria executada N vezes, send N o número total de usuários. Ou seja, total de consultas seria N + 1 (N consultas de posts mais uma consulta para a lista de usuários).
Porém, bastariam duas consultas ou mesmo um simples JOIN para resolver o problema, o que pode trazer um ganho de desempenho de até 13 vezes.
Explico o Problema do N + 1 em mais detalhes neste artigo.
3. Selecione apenas os campos que realmente vai usar
É muito comum vermos consultas como SELECT * FROM tabela
. O asterisco (*
) vai trazer todas as colunas da tabela. Mas nem sempre precisamos de todas elas.
Muitas vezes, temos uma tabela com 20, 50 ou até 100 ou mais colunas. Serão raros os casos em que você precisará de todas elas.
Por isso sempre defina quais campos quer selecionar.
4. Faça cache das consultas
As consultas mais rápidas são aquelas não executadas. Explico: sempre que você executa uma consulta SQL, uma determinada quantidade de recursos do servidor é usada, além do tempo gasto, é claro.
Por isso, uma ótima opção para sites grandes e com muito tráfego é criar cache de dados, evitando que algumas consultas SQL frequentes sejam executadas pelo SGBD.
Há diversas ferramentas para isso, como, por exemplo, AdoDB e Memcached.
5. Use a cláusula LIMIT
Outra vez, parece uma dica óbvia – até demais. Porém, por incrível que pareça, tem muita gente por aí que não faz isso.
Imagine um site ou blog que exibe apenas 10 registros por página. O correto é usar LIMIT
para trazer apenas esses 10.
Já vi códigos sem esse LIMIT, que buscam diversos registros e pegam, via programação, apenas os 10 primeiros.
6. Use JOINs em vez de sub-consultas
Quando programamos, usar sub-consultas é algo simples, lógico e funcional, como neste exemplo:
SELECT usuarios.id, ( SELECT MAX(data_criacao) FROM posts WHERE usuario_id = usuarios.id ) AS ultimo_post FROM usuarios u
Embora sub-consultas sejam úteis, usar JOIN é igualmente funcional e mais rápido.
A consulta anterior pode ser transformada nesta:
SELECT a.id, MAX(p.data_criacao) AS ultimo_post FROM usuarios u INNER JOIN posts p ON (u.id = p.usuario_id) GROUP BY u.id
7. Use UNIONs em vez de ORs
A seguinte consulta utiliza a cláusula OR para filtrar os registros:
SELECT * FROM tabela1, tabela2 WHERE tabela1.p = tabela2.q OR tabela1.x = tabela2.y;
A cláusula UNION permite combinar os resultados de dois ou mais SELECTs.
A seguinte consulta, usando UNION, vai trazer os mesmos resultados que a consulta anterior, sendo mais rápida:
SELECT * FROM tabela1, tabela2 WHERE tabela1.p = tabela2.q UNION SELECT * FROM tabela1, tabela2 WHERE tabela1.x = tabela2.y
8. Utilize índices
Índices de banco de dados são como índices de bibliotecas. Eles permitem ao banco de dados encontrar os resultados sem perder tempo olhando registro por registro. Assim como um leitor olha o índice da biblioteca e encontra um livro com mais facilidade e rapidez.
Sempre crie índices em suas tabelas, indexando os campos que são frequentemente consultados.
9. Otimize as tabelas do banco de dados
Alguns SGBDs, como o MySQL, possuem ferramentas nativas para otimização de seus dados.
Se suas tabelas são frequentemente modificadas, recebendo novos dados e removendo outros, pode ser bom rodar uma otimização com certa frequência, para tornar as tabelas menores e mais rápidas.
A otimização toma um certo tempo para ser executada. Por isso é recomendável agendá-la para madrugadas ou para horários quando seu sistema tem pouco uso.
Para o MySQL, um simples exemplo de otimização pode ser feito com esta consulta:
OPTIMIZE TABLE nome_da_tabela;
10. Use um servidor de busca
Todas as dicas anteriores são válidas e trazem um certo ganho de desempenho. Mas já imaginou conseguir ganhos de desempenho de até 278 vezes?! Esse é o ganho que podemos conseguir com um Servidor de Busca como o ElasticSearch, que permite armazenar dados de forma otimizada para buscas extremamente rápidas.
Se o seu sistema faz muitos SELECTs, o ElasticSearch pode trazer ganhos fenomenais em desempenho.
Veja neste vídeo algumas dicas para acelerar o seu site até 278 vezes!