Data

15 mar, 2018

MySQL – Melhorando o desempenho e evitando problemas

Publicidade

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!