Optimización de Índices en PostgreSQL

PostgreSQLPostgreSQLBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo optimizar el rendimiento de la base de datos PostgreSQL mediante la indexación. Comenzará creando una tabla de ejemplo users y llenándola con datos. Luego, creará un índice de una sola columna, analizará los planes de consulta utilizando EXPLAIN, construirá un índice de varias columnas y, finalmente, aprenderá cómo eliminar un índice no utilizado para mantener la eficiencia de la base de datos. Esta experiencia práctica le proporcionará habilidades prácticas en la gestión de índices de PostgreSQL.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL postgresql(("PostgreSQL")) -.-> postgresql/PostgreSQLGroup(["PostgreSQL"]) postgresql/PostgreSQLGroup -.-> postgresql/table_init("Create Basic Table") postgresql/PostgreSQLGroup -.-> postgresql/row_add("Insert One Row") postgresql/PostgreSQLGroup -.-> postgresql/data_where("Filter With WHERE") postgresql/PostgreSQLGroup -.-> postgresql/idx_simple("Create Simple Index") postgresql/PostgreSQLGroup -.-> postgresql/idx_drop("Drop Existing Index") subgraph Lab Skills postgresql/table_init -.-> lab-550955{{"Optimización de Índices en PostgreSQL"}} postgresql/row_add -.-> lab-550955{{"Optimización de Índices en PostgreSQL"}} postgresql/data_where -.-> lab-550955{{"Optimización de Índices en PostgreSQL"}} postgresql/idx_simple -.-> lab-550955{{"Optimización de Índices en PostgreSQL"}} postgresql/idx_drop -.-> lab-550955{{"Optimización de Índices en PostgreSQL"}} end

Crear un índice de una sola columna

En este paso, creará una tabla de ejemplo llamada users y luego creará un índice de una sola columna en la columna email. Los índices son cruciales para mejorar el rendimiento de las consultas de la base de datos, especialmente cuando se trata de tablas grandes.

Primero, conéctese a la base de datos PostgreSQL como el usuario postgres:

sudo -u postgres psql

Ahora, cree la tabla users. Ejecute el siguiente comando SQL:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP
);

Este comando crea una tabla llamada users con columnas para id, username, email y created_at. La columna id es la clave primaria (primary key) y se incrementa automáticamente.

A continuación, inserte algunos datos de ejemplo en la tabla users. Ejecute los siguientes comandos SQL:

INSERT INTO users (username, email, created_at) VALUES
('john_doe', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('jane_smith', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('peter_jones', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('mary_brown', '[email protected]', NOW());

Ahora ha insertado cuatro filas de datos en la tabla users.

Para acelerar las consultas basadas en la columna email, cree un índice en la columna email. Ejecute el siguiente comando SQL:

CREATE INDEX idx_users_email ON users (email);

Este comando crea un índice llamado idx_users_email en la columna email de la tabla users.

Para verificar que el índice se ha creado, puede usar el comando \di en psql. Ejecute el siguiente comando:

\di

Debería ver el índice idx_users_email listado en la salida.

Finalmente, salga del shell psql escribiendo:

\q

Usar EXPLAIN para analizar los planes de consulta (Query Plans)

En este paso, aprenderá cómo usar el comando EXPLAIN en PostgreSQL para analizar los planes de consulta (query plans). Comprender los planes de consulta es esencial para optimizar las consultas de la base de datos y garantizar un rendimiento eficiente.

Primero, conéctese a la base de datos PostgreSQL como el usuario postgres:

sudo -u postgres psql

Ahora, usemos el comando EXPLAIN para analizar una consulta simple. Ejecute el siguiente comando:

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

Este comando mostrará el plan de consulta para la sentencia SELECT. La salida muestra cómo PostgreSQL tiene la intención de ejecutar la consulta, incluyendo si utilizará un índice.

Para obtener información más detallada, incluido el costo, puede usar EXPLAIN ANALYZE. Sin embargo, para este ejemplo básico, EXPLAIN es suficiente.

Ahora, analicemos una consulta que podría no usar el índice. Ejecute el siguiente comando:

EXPLAIN SELECT * FROM users WHERE username LIKE 'john%';

La salida probablemente mostrará un "Seq Scan" (Sequential Scan - Escaneo Secuencial) en la tabla users, lo que significa que PostgreSQL está escaneando toda la tabla para encontrar las filas coincidentes. Esto es menos eficiente que usar un índice.

Al analizar los planes de consulta con EXPLAIN, puede identificar posibles cuellos de botella (bottlenecks) en el rendimiento y determinar si sus índices se están utilizando de manera efectiva.

Finalmente, salga del shell psql escribiendo:

\q

Construir un índice de múltiples columnas (Multi-Column Index)

En este paso, aprenderá cómo crear un índice de múltiples columnas (multi-column index) en PostgreSQL. Un índice de múltiples columnas es un índice que incluye dos o más columnas. Puede mejorar significativamente el rendimiento de las consultas cuando las consultas filtran u ordenan por múltiples columnas simultáneamente.

Primero, conéctese a la base de datos PostgreSQL como el usuario postgres:

sudo -u postgres psql

Digamos que a menudo consulta la tabla users basándose tanto en las columnas username como en email. Para optimizar estas consultas, puede crear un índice de múltiples columnas en estas dos columnas. Ejecute el siguiente comando SQL:

CREATE INDEX idx_users_username_email ON users (username, email);

Este comando crea un índice llamado idx_users_username_email en las columnas username y email de la tabla users. El orden de las columnas en la definición del índice importa. El índice es más efectivo cuando la consulta filtra en las columnas en el mismo orden en que aparecen en el índice.

Para verificar que el índice se ha creado, puede usar el comando \di en psql. Ejecute el siguiente comando:

\di

Debería ver el índice idx_users_username_email listado en la salida.

Ahora, analicemos una consulta que puede beneficiarse de este índice de múltiples columnas. Ejecute el siguiente comando:

EXPLAIN SELECT * FROM users WHERE username = 'john_doe' AND email = '[email protected]';

La salida debería mostrar que PostgreSQL está utilizando el índice idx_users_username_email para ejecutar la consulta.

Finalmente, salga del shell psql escribiendo:

\q

Eliminar un índice no utilizado (Unused Index)

En este paso, aprenderá cómo eliminar un índice no utilizado (unused index) en PostgreSQL. Los índices mejoran el rendimiento de las consultas, pero también consumen espacio de almacenamiento y pueden ralentizar las operaciones de escritura (inserciones, actualizaciones y eliminaciones). Por lo tanto, es importante identificar y eliminar los índices que ya no se utilizan.

Primero, conéctese a la base de datos PostgreSQL como el usuario postgres:

sudo -u postgres psql

Supongamos que después de analizar sus patrones de consulta, determina que el índice idx_users_email rara vez se utiliza. Para eliminar este índice, ejecute el siguiente comando SQL:

DROP INDEX idx_users_email;

Este comando elimina el índice llamado idx_users_email de la base de datos.

Para verificar que el índice se ha eliminado, puede usar el comando \di en psql. Ejecute el siguiente comando:

\di

Ya no debería ver el índice idx_users_email listado en la salida.

Antes de eliminar un índice, es crucial asegurarse de que realmente no se utiliza. Puede utilizar el colector de estadísticas (statistics collector) de PostgreSQL para recopilar información sobre el uso del índice. Sin embargo, habilitar y analizar estas estadísticas está fuera del alcance de este laboratorio. En un escenario del mundo real, supervisaría el uso del índice durante un período de tiempo antes de decidir eliminar un índice.

Eliminar el índice incorrecto puede afectar negativamente el rendimiento de las consultas. Por lo tanto, tenga precaución y analice a fondo sus patrones de consulta antes de eliminar cualquier índice.

Finalmente, salga del shell psql escribiendo:

\q

Resumen

En este laboratorio, aprendió cómo crear índices de una sola columna (single-column indexes) e índices de múltiples columnas (multi-column indexes) en PostgreSQL para mejorar el rendimiento de las consultas. También aprendió cómo analizar los planes de consulta utilizando EXPLAIN para determinar si sus índices se están utilizando de manera efectiva. Finalmente, aprendió cómo eliminar un índice no utilizado (unused index) para mantener la eficiencia de la base de datos. Estas habilidades son esenciales para optimizar el rendimiento de la base de datos PostgreSQL.