Los índices son una poderosa herramienta que puede ayudarte a reducir el tiempo de un query y pasar de segundos a centésimas de segundos. ¡Pero cuidado! Un gran poder conlleva una gran responsabilidad, nada en el desarrollo de software es gratis, tienes que ser prudente y utilizarlo sabiamente.
.
En este artículo vas a aprender qué es un índice en SQL, aprovechar sus ventajas y cuidarte de sus desventajas. Comencemos!
Esta no sería la primera vez que escuchas de índices, cuando quieres leer un capítulo en concreto de un libro, no buscas página por página hasta encontrarlo ¿Cierto? Eso es totalmente ineficaz, lo que haces es ir al índice del libro y ver en qué página se encuentra el capítulo para ir directamente a esa página, bueno tal vez falles por unas cuantas páginas ¡Pero la computadora no!
.
En concepto el índice en SQL es lo mismo que el índice de un libro, pero si te atreves a ver más allá te das cuenta de que es mucho más complejo y tiene muchas capas de matemáticas e ingeniería de software.
.
Al crear un índice, se ejecuta un ordenamiento con un b-tree con base del campo o campos que indicamos en el índice, un b-tree es una estructura de datos compleja, para aprender más de esta te dejo un artículo. Este “árbol” se puede representar de forma muy simplificada como una tabla, donde tenemos dos campos, el índice y un pointer.
.
El índice dependerá del “orden” de esta tabla y el pointer es un apuntador al lugar exacto en memoria de la fila a la que hacemos referencia. Esto es muy útil porque se recoge una tabla una sola vez.
Tenemos una tabla con un id, nombre y apellido. Creamos un índice basado en el campo de nombre. Ahora queremos encontrar a la persona con nombre Andrea.
.
Lo que pasa es que se busca en el índice la condicional del WHERE
que pusiste y al encontrar el match se va directo al espacio en memoria y trae la información, sin necesidad de recoger la otra tabla buscando el match. Esto hace tan poderoso a los índices.
.
Pero aquí viene el “trade off” más común en el desarrollo de software, tiempo vs. espacio, nos ahorramos mucho tiempo sí, pero a costo de mucha memoria. Además de que la creación y actualización de los índices puede tardar minutos, aun si se agrega solamente una nueva fila.
Hay puntos que se deben tomar como “mandamientos” al momento de decidir si crear un índice o no, pero tienes que tomar en cuenta que estos puntos van de la mano, tomar en cuenta un solo punto no es suficiente para decidir. Los puntos son:
.
Si tienes bases de datos con millones o cientos de millones o incluso más datos, crear índices es una excelente idea, pues el tiempo que tomen los querys que harás se optimizaran perfectamente y serán mucho más rápidos. Si tienes una base de datos con pocos registros, no es tan necesario, ya que la optimización no será tan fuerte como para justificar el espacio que toman los índices y el tiempo de ejecución al crearse y actualizarse, lo que nos lleva al siguiente punto.
Crear un índice toma su tiempo y actualizarla es prácticamente volver a crearla, ya que se vuelve a indexar toda la tabla. Entonces debes considerar si los registros que vas a indexar se leen más de lo que se escriben, porque no justifica crear un índice en datos que se crean y actualizan más de lo que se leen, ya que lo importante de indexar es mejorar el tiempo de ejecución al traer datos.
.
Esto depende mucho de la lógica de negocio y el papel que toman los datos en esta. Pero una buena forma de plantearte este punto es preguntarte ¿Estos datos se leerán más de lo que se escriben? Si la respuesta sí, es un punto a favor de crear un índice.
En este punto ya tomaste tu decisión de crear un índice, pero quieres tener más claro qué campos usar para crearlo. ¿Bien, este punto también depende mucho de la lógica de negocio, ¿qué campos son los que serán más solicitados y usados a la hora de hacer querys? Para no malgastar memoria tienes que tomar la decisión, sabía de no meter datos innecesarios en los indices.
.
Hablando de datos innecesarios, los campos que agregues al índice en el mejor de los casos deben ser “NOT NULL”, que no acepten un valor nulo, pero si no es el caso, que sean campos que por la lógica de negocio no sea tan común que queden en NULL. Esto porque si existen varios datos nulos no tiene sentido hacer un índice en el campo, no se optimizara lo suficiente la búsqueda entre tantos datos nulos y el proceso matemático y de memoria que ocupan no vale la pena.
.
.
El tiempo es dinero para los negocios, pero en la industria tech, entra el factor del espacio. Estos dos “assets” son cruciales a la hora de optimizar las bases de datos, por ese motivo debes analizar muy bien como y que optimizar con indices.
.
Eso-eso-eso es todo amigos, espero que tomes en cuenta los puntos que te enseñé hoy, toma sabias decisiones a la hora de crear índices y no olvides del trade off, tiempo vs. espacio.
.
- Carlos Sanjines Aldazosa, @monoald 🙋🏾♂️
Excelente trabajo… Muchas gracias por compartir, de verdad me ayudo un montón para encontrarle el verdadero sentido al tema de los índices en SQL
Gracias por tu aporte
Excelente amigo, me agrado mucho tu publicación, soy nuevo en el tema de optimización, pero poco a poco voy comprendiendo.
Muchas gracias por tu colaboración.