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.
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.
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
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'.
Mostrar pista
Sintaxis: CREAR ÍNDICE nombre EN la tabla (col1, col2);
Solución disponible después de 3 intentos
Explorando índices condicionales (parciales)
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'.
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