Saltar al contenido principal
eLearner.app
Módulo 10 · Lección 3 de 439/57 en el curso~12 min
Lecciones del módulo (3/4)

Índices compuestos y parciales

En lecciones anteriores cubrimos el uso de índices para consultas DBMS lineales (WHERE country = 'Italy'). ¿Qué pasa cuando buscamos en dos frentes combinados?

Por ejemplo, en un comercio electrónico real es posible que deseemos buscar pedidos que pertenezcan a un ID de cliente específico Y que se encuentren dentro de un rango de tiempo determinado: CÓDIGOPH0.

Si solo tiene un índice base en customer_id, Postgres encontrará los 50 pedidos del cliente en poco tiempo usando el árbol binario, pero luego tiene que iterar a través de los 50 de forma manual y secuencial, filtrando perezosamente las fechas a ojo.

Índices compuestos

Podemos decirle al DBMS que ordene los archivos del "diccionario analítico" no según una única dimensión clave, sino según varias.

SQL
CREATE INDEX idx_orders_customer_date ON orders(customer_id, placed_at);

Un índice "compuesto" trata el orden de sus parámetros como muy importante: aquí los nodos del árbol B se agrupan y categorizan rígidamente customer_id en un bloque (el más discriminante para la separación); dentro de ellos vive el subárbol que se ramifica con los diversos valores de tiempo de placed_at en orden perfecto.

Esta estructura aniquila brutalmente las cláusulas WHERE con múltiples predicados anidados.

Índices parciales (índices filtrados)

Cada índice cuesta espacio en disco y CPU en los flujos de entrada del usuario. ¿Qué pasaría si el comercio electrónico requiriera clasificar y recuperar constantemente un filtro, pero sólo para una minoría de registros? (Por ejemplo: sondear rápidamente la comprobación de notificaciones no leídas). Crear un índice "is_read" sobre los 10.000.000 de notificaciones es increíblemente tedioso si "No leído" sólo representa 5 de ellas.

SQL
CREATE INDEX idx_unread_notifs ON notifications(user_id)
  WHERE is_read = false; -- Questa aggiuntiva è l'"Indice Parziale"

La base de datos creará un árbol B ultrarrápido que almacena claves de acceso rápido a la base de datos SÓLO si el registro no está leído. El disco se enamorará de un índice de 5 filas (3 bytes) en lugar de uno de 10 millones. Los Fast SELECT se benefician plenamente:

CÓDIGOPH0

Tu turno

Ejercicio#sql.m10.l3.e1
Intentos: 0Cargando...

Queremos optimizar la búsqueda de contraseñas temporales/tokens de restablecimiento. Con mucha frecuencia realizamos llamadas SELECT en busca de todos los clientes registrados de un país específico combinado con una ciudad conocida. Cree un índice compuesto llamado 'idx_cust_loc' en 'clientes'. Pase primero el campo 'país' (que es más exclusivo) y luego el campo 'ciudad'.

Cargando editor...
Mostrar pista

Sintaxis: CREAR ÍNDICE nombre EN la tabla (col1, col2);

Solución disponible después de 3 intentos

Explorando índices condicionales (parciales)

Ejercicio#sql.m10.l3.e2
Intentos: 0Cargando...

Optimice la búsqueda de un usuario de compras: los usuarios se preinscriben, pero solo necesitamos enumerarlos en su orden de registro cronológico (cree un índice en 'signed_up_on' en 'clientes') pero LIMITADO SÓLO a clientes de la 'ciudad' de cadena completa exacta: 'Milano'.

Cargando editor...
Mostrar pista

Normalmente se declara en la propiedad de destino; al final, agrega la palabra clave mágica WHERE ciudad = 'Milano'.

Solución disponible después de 3 intentos