em

Os dez principais erros MySQL cometidos por desenvolvedores PHP

Plataforma LAMP
Um banco de dados é um componente fundamental para a maioria das aplicações web, por consequência, seu planejamento, estruturação e manutenção devem ser tratados com prioridade.
Embora o PHP seja uma linguagem relativamente fácil aonde mesmo sem muita de prática podemos criar projetos razoavelmente complexos, a construção de um banco de dados sólido e confiável requer tempo e experiência.

Vamos fazer uma análise dos equívocos mais frequentes cometidos no MySQL e a abordagem mais profissional a se adotar em nossos trabalhos.


1. Usar MyISAM em vez de InnoDB

MyISAM é usado por padrão no MySQL, no entanto, a menos que você esteja criando um banco de dados simples ou que sofra alteração com pouca frequência, ele não será uma boa escolha.
O MyISAM não suporta restrições de chaves estrangeiras ou transações que são essenciais para a integridade dos dados. Além disso, toda a tabela é bloqueada quando um registro é inserido ou atualizado, o que provoca um efeito negativo sobre o desempenho do banco.
A solução é simples: usar o InnoDB.

2. Utilizar funções mysql nativas do PHP
Muitos desenvolvedores utilizam funções como: mysql_query, mysql_connect, mysql_fetch_assoc, etc, mas o próprio manual do PHP recomenda:

If you are using MySQL versions 4.1.3 or later it is strongly recommended that you use the mysqli extension instead.

Tradução:
“Se você estiver usando versões do MySQL 4.1.3 ou posterior é fortemente recomendado que você use a extensão MySQLi.”

Dentre as vantagens citamos:

  • uma interface (opcional) orientada a objeto
  • instruções preparadas que ajudam a evitar ataques de injeção SQL e aumentar o desempenho
  • declarações múltiplas e suporte a transações

Se você quiser ter suporte vários bancos de dados pode usar o DOP (PHP Data Objects).

3. Não fazer validação dos dados
Regra número um: não confie nas entradas inseridas pelos usuários, usar a validação por JavaScript ajuda a evitar trafego desnecessário ao servidor, mais ela não é o bastante, faça validação também pelo lado do servidor.
Veja um exemplo de ataque de injeção de SQL simples explorando dados sem validação:

$username = $_POST[“name”];
$password = $_POST[“password”];
$sql = “SELECT userid FROM usertable WHERE username=’$username’ AND password=’$password’;”;

Se alguém digitar apenas ” admin’; — ” no campo username o servidor vai interpretar a seguinte query:

SELECT userid FROM usertable WHERE username=’admin’;

Como consequência, o usuário poderá fazer login como “admin” sem precisar saber a senha.

4. Não usar UTF-8
UTF-8 resolve muitos problemas com acentuação de palavras, fazer sua implementação pode ser um pouco trabalhoso mais vai lhe evitar futuras dores de cabeça, veja um bom tutorial aqui.

5. Usar PHP ao invés de SQL
Se você tem mais afinidade com PHP do que com o MySQL, é mais cômodo resolver os problemas na linguagem que você conhece.O problema é que isso pode deixar seu código complexo e mais lento sem necessidade, por exemplo, ao invés de usar a função nativa do MySQL AVG (), usar um loop PHP para calcular uma média somando todos os valores de um conjunto de registros.
Pesquise pelas funções MySQL antes de tentar reinventar a roda!
Cuidado também com consultas SQL dentro de loops PHP. Normalmente, é mais eficaz executar uma consulta, em seguida, percorra os resultados.

6. Não é otimizar suas consultas
99% dos problemas de desempenho do PHP são causados pelo banco de dados, uma única consulta SQL mal formulada pode atrapalhar toda sua aplicação web.
EXPLAIN
, Query Profiler , e muitas outras ferramentas podem ajudá-lo a localizar problemas e otimizar seu desempenho.

7. Usar tipos de dados errados
MySQL oferece uma grande gama de tipos de dados, se você armazenar uma data, use um campo DATE ou DATETIME, usar um tipo integer ou string pode resultar em consultas SQL mais complicada ou até impossível.

8. Utilizar * em consultas SELECT
Evite sempre usar * para retornar todas as colunas em uma tabela, não seja preguiçoso. Você só deve extrair os dados que você precisa.

9. Sub ou super-indexação

Como regra geral, os índices devem ser aplicados a qualquer coluna chamada na cláusula WHERE de uma consulta SELECT.
Por exemplo, suponha que temos uma tabela usuário com uma identificação numérica (a chave primária) e um endereço de e-mail, durante uma consulta, o MySQL deve localizar a identificação correta procurando por um e-mail, com um índice o MySQL pode utilizar um algoritmo de busca para localizar rapidamente o e-mail quase que instantaneamente. Sem um índice o MySQL vai verificar todos os registros em sequência até que o endereço seja encontrado.
Parece tentador adicionar um índice para cada coluna, no entanto, eles são regerados durante toda consulta INSERT ou UPDATE, e como resultado seu desempenho vai para o chão.
Conclusão: só adicionar índices quando necessário.

10. Esquecer de fazer backup
Você pode até pensar que isso nunca vai acontecer, mas bancos de dados podem falhar, discos rígidos podem se corromper, servidores podem explodir. hosts da Web podem ir à falência, etc.
Perder os seus dados de MySQL pode ser catastrófico, para garantir seus cabelos, noites de sono ou mesmo o emprego, mantenha sempre backups automatizados ou replicação local.

Você comete mais algum erro frequente? Compartilhe conosco.

Gostou dessa matéria?

Inscreva seu email para receber atualizações com as últimas publicações do nosso blog.

3 opinaram!

Deixe sua opinião!
  1. Ótimo post, valeu por linkar o tutorial.
    Uma boa pedida para validação de dados seria utilizar Expressões Regulares. Pode ficar um pouco lento, mas é uma boa opção para evitar que dados incorretos comprometam o banco.
    Valeu, e sucesso!

Deixe o seu comentário: