Nesta etapa, você aprenderá a comparar o desempenho de diferentes tipos de subconsultas no MySQL. Compreender as características de desempenho das subconsultas é crucial para escrever consultas SQL eficientes, especialmente ao lidar com grandes conjuntos de dados.
-
Adicionar Mais Dados à Tabela orders:
Para tornar a comparação de desempenho mais realista, vamos adicionar uma quantidade significativa de dados à tabela orders. Inseriremos 1000 pedidos para cada cliente usando um stored procedure. Execute os seguintes comandos SQL no prompt do MySQL:
DELIMITER //
CREATE PROCEDURE insert_many_orders()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 1000 DO
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (1, CURDATE(), 50.00);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (2, CURDATE(), 75.00);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (3, CURDATE(), 100.00);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (4, CURDATE(), 125.00);
SET i = i + 1;
END WHILE;
END//
DELIMITER ;
CALL insert_many_orders();
DROP PROCEDURE insert_many_orders;
Explicação:
- Este script SQL cria um stored procedure chamado
insert_many_orders.
- O procedimento insere 1000 pedidos para cada um dos quatro clientes na tabela
orders.
- Após inserir os dados, o procedimento é descartado.
-
Consulta usando IN:
Execute a seguinte consulta usando IN para encontrar todos os clientes que fizeram pelo menos um pedido:
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
-
Analisar o Plano de Execução da Consulta usando EXPLAIN:
Antes de executar a consulta, use o comando EXPLAIN para analisar o plano de execução da consulta. Isso lhe dará insights sobre como o MySQL planeja executar a consulta e identificar possíveis gargalos de desempenho. Execute o seguinte comando SQL no prompt do MySQL:
EXPLAIN SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
A saída do EXPLAIN mostrará as tabelas que estão sendo acessadas, os índices que estão sendo usados (se houver) e a ordem em que as operações são realizadas. Preste atenção à coluna type, que indica o tipo de join ou método de acesso utilizado.
-
Consulta usando EXISTS:
Execute a seguinte consulta usando EXISTS para encontrar todos os clientes que fizeram pelo menos um pedido:
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
-
Analisar o Plano de Execução da Consulta usando EXPLAIN:
Use o comando EXPLAIN para analisar o plano de execução da consulta EXISTS. Execute o seguinte comando SQL no prompt do MySQL:
EXPLAIN SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
Compare o plano de execução com o da consulta IN. Existem diferenças nas tabelas acessadas, índices usados ou métodos de acesso?
-
Observações:
Em geral, EXISTS tende a ter um desempenho melhor que IN quando a subconsulta retorna um grande número de linhas. Isso ocorre porque IN precisa comparar os valores da consulta externa com todos os valores retornados pela subconsulta, enquanto EXISTS para assim que encontra uma correspondência. No entanto, o desempenho real pode variar dependendo da consulta específica, dos dados e do sistema de banco de dados. Você pode usar a função BENCHMARK() (como mostrado no documento original) para obter uma medição mais precisa do tempo de execução, mas para este laboratório, analisar a saída do EXPLAIN fornece insights suficientes sobre os planos de consulta.
-
Limpeza (Opcional):
Se você quiser limpar o banco de dados e as tabelas, pode executar os seguintes comandos no prompt do MySQL:
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customers;
DROP DATABASE IF EXISTS labdb;
Quando terminar todas as etapas, você pode sair do cliente MySQL digitando:
exit