1. Situación inicial
    1. Búsqueda sin orden
    2. Búsqueda ordenada
  2. Índices
    1. ¿Qué son los índices?
    2. ¿Cómo mejoran las búsquedas?
    3. Tipos de índices en Postgres
  3. Tipos de índices usados en Habitissimo
  4. Ventajas e inconvenientes del uso de índices.
  1. Situación inicial

Para entender la necesidad de los índices, supongamos un escenario como el siguiente:

Tenemos un libro en blanco en el cual vamos a ir escribiendo los nombres de los alumnos que asisten a una clase cada día. Inicialmente apuntamos los nombres de cómo van llegando los alumnos a clase el primer día.

  1. Búsqueda sin orden

Supongamos que el director del colegio nos pregunta si Amparo ha venido al colegio hoy. Lo que haremos en este caso es empezar a buscar en la línea 1 luego la 2 y así de manera secuencial hasta que llegue a la línea que me devuelva el valor “Amparo”.

Habría un caso incluso peor que es el caso de buscar un nombre que no existe, pues nos obligaría a recorrer toda la lista de alumnos para confirmar que el nombre buscado no ha asistido a clase ese día.

Esto tiene un coste en tiempo que es directamente proporcional al número de registros que tengamos. Matemáticamente haremos (n) operaciones.

  1. Búsqueda ordenada

Podemos mejorar sustancialmente esta búsqueda si ordenamos previamente los nombres alfabéticamente:

Supongamos en este caso que buscamos a “Amparo”, en este caso lo que se hace es ir a buscar en la mitad de la tabla, concretamente en la casilla número 3. Devolvemos el valor “Mario” que no es el valor buscado “Amparo”. Tenemos dos opciones, seguir hacia abajo o seguir hacia arriba. En el caso de seguir hacia abajo no encontraremos nunca el valor porque la A de “Amparo” va antes que la M de “Mario” con lo que no hace falta continuar con la busqueda hacia abajo y nos centramos en la mitad superior (correspòndiente al intervalo de 1 a 3).

Repetiremos el proceso otra vez, buscando en la mitad de este nuevo bloque y eso nos daría la posición 1, que devuelve el valor de “Amparo” que era el que buscábamos.

En este caso en lugar de 9 búsquedas como en el punto 1.1 solo hemos tenido que hacer 2 búsquedas. Matemáticamente haremos (Log2(n)) operaciones.

La búsqueda dentro de estructuras ordenadas, supone un gran avance aunque es posible todavía mejorarlo un poco más con la ayuda de Índices.

  1. Índices
    1. ¿Qué son los índices?

El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, por medio de un identificador único de cada fila de una tabla, permitiendo un rápido acceso a los registros de una tabla en una base de datos.

El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo hay que buscar en el índice dicho elemento para, una vez encontrado, devolver un registro que se encuentre en la posición marcada por el índice.

  1. ¿Cómo mejoran las búsquedas?

Las tablas indexadas tienen además del valor que almacena, la posición en la tabla en la que se encuentra dicho valor.

En el caso de buscar por ejemplo “Pedro” ya accedemos directamente a la posición que ocupa en la tabla en lugar de tener que buscarlo.

Usar índices incrementa drásticamente las búsquedas dentro de una tabla.

  1. Tipos de índices en Postgres

PostgreSQL tiene 6 tipos de índices primarios:

  • Índices de árbol B
  • Índices hash
  • Índices GIN
  • BRIN
  • Índices GiST
  • Índices SP-GiST
  1. Tipos de índices usados en Habitissimo.

En habitissimo, básicamente indexamos todos los campos que tengan algún tipo de identificador (id) que nos pueda servir de primary key. Por ejemplo indexamos campos como “business_id”, “client_id” y similares.

Usamos índices BTREE por las siguientes razones:

  1. El índice BTREE es el más utilizado. Además se puede usar para cualquier tipo de dato, admite ordenación y búsqueda tanto ascendente como descendente.
  1. El índice BTREE además tiene otras características por las cuales lo usamos mayoritariamente:
  • El árbol B está equilibrado, es decir, cada página hoja está separada de la raíz por el mismo número de páginas internas. Por lo tanto, la búsqueda de cualquier valor lleva el mismo tiempo.
  • El árbol B tiene varias ramas, es decir, cada página (normalmente 8 KB) contiene muchos (cientos) ctids. Por lo tanto, la profundidad del árbol B es muy pequeña y, de hecho, puede alcanzar una profundidad de 4 a 5 para tablas muy grandes.
  • Los datos del índice se ordenan en orden no decreciente (entre páginas y dentro de cada página), y las páginas del mismo nivel se conectan entre sí mediante una lista bidireccional. Por lo tanto, podemos obtener un conjunto de datos ordenados solo en una dirección u otra de la lista, sin tener que volver a la raíz cada vez.

4.Ventajas e inconvenientes del uso de índices.

  • La lentitud en el tiempo de respuesta generalmente se debe a que los registros se almacenan aleatoriamente en las tablas de la base de datos.
  • Las consultas de búsqueda tienen que recorrer los registros almacenados aleatoriamente uno tras otro para ubicar los datos deseados.
  • Esto da como resultado bases de datos de bajo rendimiento cuando se trata de recuperar datos de tablas grandes.
  • Los índices son útiles en tales situaciones. Los índices ordenan los datos de una manera secuencial organizada. Piense en un índice como una lista ordenada alfabéticamente. Es más fácil buscar nombres que se hayan ordenado en orden alfabético que aquellos que no están ordenados.
  • Los índices se crean en la(s) columna(s) que se usarán para filtrar los datos.
  • El uso de índices en tablas que se actualizan con frecuencia puede dar como resultado un bajo rendimiento. Esto se debe a que PostgreSQL crea un nuevo bloque de índice cada vez que se agregan o actualizan datos en la tabla. En general, los índices se deben usar en tablas cuyos datos no cambian con frecuencia, pero se usan mucho en determinadas consultas de búsqueda.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.