Normalmente encontramos algumas práticas dentro dos programas que deveriam ser evitadas, por isso resolvemos incluir dicas de melhores práticas no desenvolvimento de comandos SQL que podem ser utilizadas, se você achar útil, claro.
Aproveite o query_cache
O Mysql vem com a estrutura de cache de comandos habilitado por padrão. Para aproveitá-la, você deve tentar, sempre que possível, “repetir os comandos SQL aos olhos do otimizador”, através da utilização de variáveis no comando, conforme abaixo:
Sem aproveitar query_cache | Aproveitando query_cache |
---|---|
SELECT ename FROM emp WHERE empno=10345; | $cod_emp=10345; SELECT ename FROM emp WHERE empno=$cod_emp; |
Variáveis e Constantes
Variáveis e constantes devem estar sempre do lado direito das cláusulas WHERE e HAVING, como no exemplo abaixo:
Faça assim | Evite dessa forma |
---|---|
$aumento=10%; SELECT ename FROM emp WHERE empno=2000*$aumento; |
$aumento=10%; SELECT ename FROM emp WHERE empno/$aumento=2000; |
Cuidados para não desabilitar um índice útil
Evite a utilização de funções na cláusula WHERE de comandos SQL, pois farão o Oracle não utilizar nenhum índice disponível para a coluna, (maus) exemplos:
Faça assim | Evite dessa forma |
---|---|
SELECT nome
FROM funcionario WHERE id = TO_NUMBER(‘1232’) |
SELECT nome
FROM funcionario WHERE TO_CHAR(id) = ‘1232’ |
SELECT nome
FROM funcionario WHERE id = 1233 – 1 |
SELECT nome
FROM funcionario WHERE id+1 = 1233 |
Os índices podem ser utilizados nas seguintes condições:
- Se a coluna indexada faz parte da cláusula WHERE de seu comando;
- Se a coluna indexada não for modificada por uma função.
Os índices não serão utilizados nas seguintes condições:
- Não existência de cláusula WHERE no comando SQL;
- A coluna for modificada de alguma forma.
- A busca é por NULL ou NOT NULL.
Consultando uma única linha, use o LIMIT 1
Às vezes, quando você está consultando suas tabelas, já sabe que está procurando por apenas uma única linha. Você pode estar buscando um registro exclusivo ou apenas verificando a existência de qualquer número de registros que satisfaçam sua cláusula WHERE.
SELECT ename FROM emp WHERE empno=10345 LIMIT 1;
Cuidado com o ORDER BY
Sempre que possível, tente ordenar o resultado de uma consulta do lado da aplicação, evitando tempos de respostas demorados em um ambiente multiusuário do MySQL.
SELECT * somente quando necessário
Consulte apenas as colunas estritamente necessárias para sua aplicação, evitando tráfego desnecessário na rede e possíveis gargalos em um ambiente multiusuário do MySQL.
Crie chaves primárias para todas as tabelas
Tabelas do MySQL innoDB devem possuir chaves primárias.
Mesmo não havendo amarrações com outras tabelas, o desenho de sua aplicação deverá prever uma chave primária. Se não houver uma coluna clara de PK, crie uma coluna do tipo auto_increment na sua tabela. Evite trabalhar com tabelas do MySQL innoDB sem chaves primárias. Se sua aplicação não possuir tais chaves e você, por algum motivo, não quiser criar colunas auto_increment, pense em utilizar o PostgreSQL ou o MongoDB no lugar do MySQL.
Chaves estrangeiras sem índices
Comumente utilizadas em joins de consultas SQL, as chaves estrangeiras podem ser um fator de lentidão na aplicação. Por isso recomendamos avaliar a criação de índices nas colunas FKs das tabelas dos bancos de dados.