Acceso Secuencial vs Aleatorio
Leer datos consecutivos es hasta 100x más rápido que saltar entre ubicaciones dispersas: cada salto obliga al dispositivo a ubicar el dato antes de leerlo, y ubicar cuesta más que leer. Los datos contiguos se leen de corrido; los dispersos pagan esa búsqueda en cada salto.
El costo físico de leer fuera de orden
| Medio | Secuencial | Aleatorio | Diferencia |
|---|---|---|---|
| HDD | ~100 MB/s | ~1 MB/s | 100x |
| SSD | ~500 MB/s | ~40 MB/s | 12x |
Cuantos más saltos entre páginas dé una consulta, más lenta será. Cuanto más contiguo sea el acceso, mejor aprovechará el buffer pool y el read-ahead.
Full Table Scan: el peor caso del acceso aleatorio
Sin un índice, ejecuta un Full Table Scan: lee todas las páginas de la tabla aunque la mayoría no contengan filas que cumplan la condición.
-- Full Table Scan: lectura de TODAS las páginas
SELECT * FROM usuarios WHERE email = 'abc@mail.com';
Full Table Scan: Operación de base de datos donde el motor lee cada una de las filas de una tabla, de principio a fin, para buscar los datos que cumplen con una condición.
Cómo un índice ordena el acceso
Un índice mantiene los valores de la columna indexada en orden. Al buscar por email, el motor localiza la posición exacta sin leer toda la tabla, y accede solo a las páginas que necesita.
-- Búsqueda con índice: acceso al B-Tree + páginas específicas
SELECT * FROM usuarios WHERE email = 'abc@mail.com';
El recorrido de las hojas del índice es secuencial. Luego accede a las páginas de datos. Si el índice contiene todas las columnas que necesita la consulta (index-only scan), ni siquiera toca la tabla:
-- Index-only scan: el índice contiene todos los datos necesarios
SELECT email, nombre FROM usuarios WHERE email LIKE 'abc%';
Un índice reduce el acceso aleatorio, pero no lo elimina. El recorrido del índice es secuencial, pero el salto a las páginas de datos sigue siendo aleatorio si no están ordenadas por la misma columna.
Cuándo priorizar cada tipo de acceso
| Enfoque | Ventaja | Desventaja |
|---|---|---|
| Acceso secuencial | Rápido Máxima velocidad de transferencia: los datos se leen en bloque sin pausas | Rígido Requiere datos ordenados o un índice que los organice |
| Acceso aleatorio | Preciso Útil para búsquedas puntuales (una fila por clave primaria) | Lento Cada salto requiere una operación de E/S independiente |
| Situación | Recomendación |
|---|---|
| Reporte que recorre todas las filas por rango de fecha | Índice por fecha; el orden físico del índice coincide con el orden de consulta |
| Búsqueda exacta por email | Índice en email; el costo del salto aleatorio se paga una sola vez |
LIKE '%texto' (wildcard inicial) |
No usa índice; considerar búsqueda textual |
| Tabla pequeña que entra completamente en RAM | Depende; el buffer pool reduce la diferencia; Full Table Scan puede ser aceptable |
Errores frecuentes
Error: con SSD no hay diferencia entre acceso secuencial y aleatorio.
Falso. Un SSD es ~12x más lento en acceso aleatorio. La diferencia es menor que en HDD (~100x), pero sigue siendo relevante en operaciones por segundo (IOPS).
Error: agregar un índice siempre elimina el acceso aleatorio.
No. El índice se recorre secuencialmente, pero acceder a las páginas de datos puede requerir saltos aleatorios si el índice no cubre todas las columnas.