anúncios

Mostrando postagens com marcador SQL. Mostrar todas as postagens
Mostrando postagens com marcador SQL. Mostrar todas as postagens

terça-feira, 25 de agosto de 2026

Por que minha query SQL está demorando 30 segundos?

O Problema

Você tem uma tabela pedidos com milhões de registros e precisa buscar pedidos de um cliente específico. A query simples assim demora uma eternidade:

SELECT * FROM pedidos WHERE cliente_id = 12345;

O MySQL retorna 30 segundos de espera. O PostgreSQL idem. O SQLite? Nem fala.

A Causa

Tabela sem índice na coluna cliente_id. O banco faz Full Table Scan — lendo todos os registros para encontrar os que correspondem ao critério.

A Solução

1. Adicione um índice

CREATE INDEX idx_pedidos_cliente_id ON pedidos(cliente_id);

Resultado: de 30s para 0.003s

2. Use EXPLAIN para analisar

EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 12345;

Veja se o plano mostra Using index (bom) ou Using filesort/Using temporary (ruim).

3. Evite SELECT *

Ruim SELECT * FROM pedidos WHERE cliente_id = 12345; Bom SELECT id, valor, data FROM pedidos WHERE cliente_id = 12345;

4. Verifique os índices existentes

SHOW INDEX FROM pedidos;

5. Use composição de índices quando necessário

-- Para queries que filtram por cliente E data CREATE INDEX idx_pedidos_cliente_data ON pedidos(cliente_id, data DESC);

Resultado Final

Métrica Antes Depois
Tempo de resposta 30s 0.003s
Full Table Scan Sim Não
Uso de memória Alto Baixo

Regra de Ouro

Se uma coluna aparece em WHERE, JOIN ou ORDER BY, considere criar um índice nela.

Índices não são mágicos — eles ocupam espaço em disco. Mas na maioria dos casos, o ganho de performance vale muito mais que o custo de armazenamento.

Feito!

terça-feira, 22 de outubro de 2024

Aprenda SQL do zero ao avançado

SQL (Structured Query Language) é uma linguagem de programação utilizada principalmente para interagir com bancos de dados relacionais. É fundamental entender o conceito de Sistema Gerenciador de Banco de Dados (SGBD) antes de mergulhar na aprendizagem de SQL.

Conceito de SGBD

Um Sistema Gerenciador de Banco de Dados (SGBD) é um software que permite criar, organizar, armazenar, recuperar e manipular dados em um banco de dados. Os principais componentes de um SGBD incluem:

  • Motor de banco de dados
  • Linguagem de consulta
  • Interface de usuário
  • Sistema operacional

Exemplo prático: MySQL

MySQL é um dos SGBDs mais populares e amplamente utilizado. Ele oferece uma interface de linha de comando e suporta várias linguagens de programação.

MariaDB

O MariaDB é um SGBD multiplataforma lançado em 2009, fork do MySQL. Algumas de suas vantagens incluem:

  • Baseado no MySQL
  • Licença GNU GPL
  • Multiplataforma

PostgreSQL

O PostgreSQL é outro SGBD muito popular e avançado. Algumas de suas principais características incluem:

  • Open source, sob a licença BSD e multiplataforma
  • Suporta diferentes tipos de dados
  • Meios de consulta mais complexos
  • Chaves estrangeiras e outros recursos avançados
  • Escalável para projetos de maior escala

Oracle Database

O Oracle Database é um dos SGBDs mais utilizados em aplicações corporativas:

  • Desenvolvido pela Oracle Corporation
  • Multiplataforma
  • Licença comercial
  • Suporta desde demandas simples até complexas
  • Excelente para aplicações corporativas

Microsoft SQL Server

O Microsoft SQL Server é desenvolvido pela Microsoft:

  • Disponível para Windows e Linux
  • Possui licença proprietária
  • Atende desde demandas simples até complexas
  • Robustos recursos de segurança
  • Meios de criptografia avançados

Criação do container MySQL

É necessário ter o Docker instalado no SO (Windows, Linux). Caso estja no Windows, habilite o recurso WSL2 e na loja Microsoft, pesquise Ubuntu, após a instalação do Ubuntu no WSL2, abre o terminal do Linux (Ubuntu) e segue os procedimentos abaixo dos itens 1 até 4, caso já estiver com Docker, continue no item 5.

  1. Atualização do sistema
  2. sudo apt update && sudo apt upgrade -y
  3. Instalação do Docker
  4. sudo apt install docker.io -y
  5. Inicialização do serviço Docker
  6. sudo systemctl start docker
  7. Habilitar a inicializaçao do serviço Docker no boot do sistema
  8. sudo systemctl enable docker
  9. Criar o conteiner MySQL
  10.   sudo docker run -d \
      --name projeto1_mysql \
      -p 3306:3306 \
      -e MYSQL_ROOT_PASSWORD=secret \
      -e MYSQL_DATABASE=projeto1 \
      -v projeto1_data:/var/lib/mysql \
      mysql:8
      
      

Conectando ao banco de dados

Utilizando um cliente MySQL (DBeaver), conecte no banco de dados com as devidas credenciais (usuário e senha) definido na instalação e host/porta.

Host: 127.0.0.1

Port: 3306

Username: root

Password: secret

Database: projeto1

Criação das tabelas usuários e pedido

Utilizando o banco de dados projeto1, antes de criar as tabelas, precisa selecionar qual banco de dados que serão criadas. Para isso, execute:

USE projeto1;

CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(255),
    email VARCHAR(255) UNIQUE,
    data_nascimento DATE
);

CREATE TABLE pedidos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT,
    produto VARCHAR(255),
    preco DECIMAL(10,2),
    quantidade INT,
    data_pedido DATE,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);

A tabela pedidos tem as seguintes características:
  1. O campo id é o identificador principal da tabela, gerado automaticamente pelo MySQL.
  2. usuario_id é um campo que relaciona os pedidos aos usuários específicos.
  3. produto armazena o nome do produto comprado.
  4. preco armazena o preço do produto com duas casas decimais.
  5. quantidade indica quantos itens foram comprados.
  6. data_pedido registra a data em que o pedido foi feito.
  7. Adicionamos uma chave estrangeira (FOREIGN KEY) para estabelecer uma relação entre pedidos e usuarios.

Esta estrutura permite que você mantenha dados sobre os usuários e seus respectivos pedidos, facilitando análises e consultas mais complexas posteriormente.

Fundamentos básicos de SQL

Agora, vamos explorar alguns conceitos básicos de SQL:

SELECT

O comando SELECT é usado para recuperar dados de uma ou mais tabelas.

Exemplo prático:

SELECT * FROM usuarios;

Este comando retorna todos os registros da tabela usuarios.

INSERT

O comando INSERT é utilizado para inserir novos registros em uma tabela.

Exemplo prático:

INSERT INTO usuarios (nome, email, data_nascimento) VALUES ('Bjorn Cyril', 'bjorn.cyril@hotmail.com', '1990-11-07');

INSERT INTO pedidos (id, usuario_id, produto, preco, quantidade, data_pedido) VALUES (1, 1, 'Camiseta Azul', 29.99, 2, '2024-10-20');

UPDATE

O comando UPDATE é usado para modificar dados existentes em uma tabela.

WARNING: Sempre utilize o WHERE no comando UPDATE

Exemplo prático:

UPDATE usuarios SET email = 'bjorn.cyril@gmail.com' WHERE id = 1;

DELETE

O comando DELETE é utilizado para remover registros de uma tabela.

WARNING: Sempre utilize o WHERE no comando DELETE

Exemplo prático:

DELETE FROM usuarios WHERE id = 1;

Consultas Avançadas

Vamos explorar algumas técnicas mais avançadas de SQL:

JOIN

O JOIN é usado para combinar dados de duas ou mais tabelas relacionadas.

Exemplo prático:

SELECT u.nome, p.preco FROM usuarios u JOIN pedidos p ON u.id = p.usuario_id;

Este exemplo mostra como combinar dados dos usuários e seus pedidos.

GROUP BY

O GROUP BY agrupa resultados por valores específicos.

Exemplo prático:

SELECT COUNT(*) AS quantidade_pedidos, AVG(preco) AS media_preco FROM pedidos GROUP BY usuario_id;

Este comando retorna a quantidade de pedidos e a média de preço por usuário.

Conceitos avançados

Agora vamos mergulhar em alguns conceitos mais avançados de SQL:

Subquery

Uma subquery é uma consulta dentro de outra consulta.

Exemplo prático:


SELECT *
FROM usuarios
WHERE id IN (
    SELECT usuario_id
    FROM pedidos
    WHERE preco > 100
);

Esta consulta seleciona usuários que fizeram pedidos com valor superior a 100.

UNION

O UNION combina os resultados de duas ou mais consultas.

Exemplo prático:


SELECT nome, email
FROM usuarios
UNION
SELECT nome, email
FROM clientes;

Este comando combina os resultados das tabelas usuarios e clientes.

A tabela clientes não foi criada, antes de executar, crie a tabela clientes, com base dos exemplos das tabela pedidos.

Comandos úteis do Docker

Para parar o container

sudo docker stop projeto1_mysql

Para iniciar o container

sudo docker start projeto1_mysql

Para remover o container

sudo docker rm projeto1_mysql

Para remover o volume

sudo docker volume rm projeto1_data

Considerações finais

SQL é uma linguagem poderosa e versátil que forma a base de muitos sistemas de banco de dados modernos. Compreender esses conceitos básicos e avançados é fundamental para qualquer desenvolvedor ou analista de dados.

Pratique regularmente e explore diferentes bancos de dados para melhorar suas habilidades. Lembre-se de que a prática é a chave para dominar SQL efetivamente.

Feito!