En este paso, aprenderá a comparar el rendimiento de diferentes tipos de subconsultas en MySQL. Comprender las características de rendimiento de las subconsultas es crucial para escribir consultas SQL eficientes, especialmente al tratar con grandes conjuntos de datos.
El rendimiento de una subconsulta puede verse afectado por varios factores, entre ellos:
-
Agregar Más Datos a la Tabla orders:
Para que la comparación de rendimiento sea más realista, agreguemos una cantidad significativa de datos a la tabla orders. Insertaremos 1000 pedidos para cada cliente utilizando un procedimiento almacenado. Ejecute los siguientes comandos SQL en el prompt de 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;
Explicación:
- Este script SQL crea un procedimiento almacenado llamado
insert_many_orders.
- El procedimiento inserta 1000 pedidos para cada uno de los cuatro clientes en la tabla
orders.
- Después de insertar los datos, el procedimiento se elimina.
-
Consulta usando IN:
Ejecute la siguiente consulta usando IN para encontrar todos los clientes que han realizado al menos un pedido:
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
-
Analizar el Plan de Ejecución de la Consulta usando EXPLAIN:
Antes de ejecutar la consulta, utilice el comando EXPLAIN para analizar el plan de ejecución de la consulta. Esto le dará información sobre cómo MySQL planea ejecutar la consulta e identificará posibles cuellos de botella en el rendimiento. Ejecute el siguiente comando SQL en el prompt de MySQL:
EXPLAIN SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
La salida de EXPLAIN le mostrará las tablas que se están accediendo, los índices que se están utilizando (si los hay) y el orden en que se realizan las operaciones. Preste atención a la columna type, que indica el tipo de join o método de acceso utilizado.
-
Consulta usando EXISTS:
Ejecute la siguiente consulta usando EXISTS para encontrar todos los clientes que han realizado al menos un pedido:
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
-
Analizar el Plan de Ejecución de la Consulta usando EXPLAIN:
Utilice el comando EXPLAIN para analizar el plan de ejecución de la consulta EXISTS. Ejecute el siguiente comando SQL en el prompt de MySQL:
EXPLAIN SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
Compare el plan de ejecución con el de la consulta IN. ¿Hay alguna diferencia en las tablas accedidas, los índices utilizados o los métodos de acceso?
-
Observaciones:
En general, EXISTS tiende a tener un mejor rendimiento que IN cuando la subconsulta devuelve un gran número de filas. Esto se debe a que IN necesita comparar los valores de la consulta externa con todos los valores devueltos por la subconsulta, mientras que EXISTS se detiene tan pronto como encuentra una coincidencia. Sin embargo, el rendimiento real puede variar dependiendo de la consulta específica, los datos y el sistema de base de datos. Puede utilizar la función BENCHMARK() (como se muestra en el documento original) para obtener una medición más precisa del tiempo de ejecución, pero para este laboratorio, analizar la salida de EXPLAIN proporciona información suficiente sobre los planes de consulta.
-
Limpieza (Opcional):
Si desea limpiar la base de datos y las tablas, puede ejecutar los siguientes comandos en el prompt de MySQL:
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customers;
DROP DATABASE IF EXISTS labdb;
Cuando haya terminado todos los pasos, puede salir del cliente MySQL escribiendo:
exit