Neste artigo veremos como melhorar o desempenho e evitar problemas ao usar o banco de dados MySQL.
1 – Ao criar uma Store Procedure, não use o mesmo nome no parâmetro de consulta na cláusula Where e o nome do campo na consulta
DELIMITER $ CREATE PROCEDURE `getCategoriasPorId`(IN CategoryID INT) BEGIN SELECT CategoryID,CategoryName FROM categories WHERE CategoryID=CategoryID; END; $ DELIMITER ;
Vai retornar todos os registros.
DELIMITER $ CREATE PROCEDURE `getCategoriasPorId`(IN CategoriaID INT) BEGIN SELECT CategoryID,CategoryName FROM categories WHERE CategoryID=CategoriaID; END; $ DELIMITER ;
O nome do parâmetro agora é diferente do nome do campo.
Serão retornados todos os registros, pois o MySQL interpreta o valor do campo como o valor do parâmetro, o que é similar a 1=1.
2 – Utilize o mesmo tipo de dados na cláusula Where da consulta
SELECT CategoryID,CategoryName FROM categories WHERE CategoryID > '2';
Tipo de dados de CategoryID é int e parâmetro é uma string.
SELECT CategoryID,CategoryName FROM categories WHERE CategoryID > 2 ;
CategoryID é do mesmo tipo de dados que o parâmetro.
O desempenho será impactado, pois o MySQL vai precisar de memória extra para a fazer a conversão do tipo.
3 – Utilize a cláusula EXISTS
if(select count(*) from categories) > 0
if EXISTS(select count(*) from categories) > 0
Isso melhora o tempo de resposta da consulta.
4 – Evite usar funções em colunas indexadas
select CategoryName from categories Where UPPER(CategoryName) LIKE `J%`
select CategoryName from categories Where CategoryName LIKE `J%`
A utilização da função irá anular a finalidade da coluna indexada.
5 – Prefira usar ENUM a VARCHAR em colunas com múltiplos valores (ex. gênero, status, etc)
-- VARCHAR CREATE TABLE Aluno( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, nome VARCHAR(50) NOT NULL, sexo VARCHAR(50) )ENGINE=MyISAM;
-- ENUM CREATE TABLE Aluno( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, nome VARCHAR(50) NOT NULL, sexo ENUM('Masculino','Feminino') )ENGINE=MyISAM;
O tempo de resposta é melhor com ENUM.
6 – Evite usar SELECT *
Se você estiver selecionando apenas algumas colunas de uma tabela, evite usar SELECT *.
Embora seja mais fácil escrever, isso vai impactar no desempenho da consulta. Ao selecionar apenas as colunas que você precisa, você está reduzindo o tamanho da tabela de resultados, reduzindo o tráfego de rede, e além disso, aumentando o desempenho.
7 – Evite usar a cláusula GROUP BY sem usar funções agregadas
SELECT CategoryID, Description, CategoryName FROM categories GROUP BY CategoryName;
SELECT CategoryName, count(*) as count FROM categories GROUP BY CategoryName;
A consulta sempre vai recuperar o primeiro registro pela coluna agrupada, de modo que será diferente, se esperarmos todos os registros, que são baseados em uma coluna agrupada.
E estamos conversados!