Cómo funcionan las Bases de Datos — Parte I

I. N. Palacios
7 min readFeb 14, 2023

--

Photo by Jan Antonin Kolar on Unsplash

El propósito de esta publicación es conocer el funcionamiento principal de las bases de datos, dado que es fundamental para el éxito general de la mayoría de los sistemas.

Hablaramos de índices y transacciones en un RDBMSs.

RDBMS

Una base de datos relacional es una base de datos digital basada en el modelo de datos relacionales propuesto por E. F. Codd en 1970. Se utiliza un sistema de gestión de bases de datos relacionales (RDBMS) para mantener las bases de datos relacionales. Muchos sistemas de bases de datos relacionales tienen la opción de usar SQL (lenguaje de consulta estructurado) para consultar y mantener la base de datos. Con claros ejemplos que incluyen: MySQL y PostgreSQL.

ÍNDICES

Los índices son una estructura de datos que ayuda a disminuir el tiempo de búsqueda de los datos solicitados. Los índices logran esto con los costos adicionales de almacenamiento, memoria y mantenimiento actualizado (escrituras más lentas), lo que nos permite omitir la tediosa tarea de verificar cada fila de la tabla.

Como un índice en la parte posterior de un libro de texto, te ayuda a llegar a la página correcta. No soy un gran admirador de la analogía del libro, se desmorona rápidamente a medida que profundizamos en los índices de la base de datos, pero es una excelente manera de presentar el tema.

Porqué necesitamos índices?

Pequeñas cantidades de datos son manejables pero, (piense en una lista de asistencia para una clase pequeña) cuando aumentan (piense en el registro de nacimiento de una gran ciudad) menos. Todo lo que solía ser rápido se vuelve más lento, demasiado lento.

Piense en cómo cambiaría su estrategia si tuviera que encontrar algo en 1 página frente a miles de páginas de nombres. Tomemos un segundo y pensemos.

No importa lo que se le ocurra, alguna base de datos ha implementado casi todas las buenas estrategias que se le pueden ocurrir en algún momento. A medida que crecen, los sistemas recopilan y almacenan más datos, lo que finalmente genera el problema anterior.

Necesitamos índices que nos ayuden a obtener los datos relevantes que necesitamos lo más rápido posible.

Cómo funcionan los índices?

Entonces, una de las preguntas de solución que a menudo se plantea arriba es almacenar estos datos de forma lógica sobre cómo los buscaría. Es decir, si desea buscar en la lista por nombre, ordenaría la lista por nombre. Hay pocos problemas con esa estrategia. Las plantearé principalmente como preguntas para el lector aquí:

  • ¿Qué sucede si desea buscar los datos de varias maneras?
  • ¿Cómo lidiaría con la adición de nuevos datos a la lista? ¿Es eso rápido
  • ¿Cómo lidiarías con las actualizaciones?
  • ¿Cuál es la notación O en estas tareas?

Algo sobre lo que pensar. Independientemente de su estrategia original, definitivamente necesitamos una forma de mantener el orden para que podamos obtener rápidamente datos relevantes no ordenados (más sobre eso pronto)

Imagina la figura 1.1 debajo:

Figura 1.1 Tabla pequeña que se lee fácilmente desde el disco rápidamente.

Los datos subyacentes se distribuyen por el almacenamiento sin ningún orden y se asignan de manera perceptiblemente aleatoria. Hoy en día, la mayoría de los servidores de producción vienen con SSD, pero hay algunos casos en los que desearía discos giratorios (HDD), pero, sinceramente, las razones son cada vez menores a medida que los precios de las SSD bajan significativamente.

Nota: SSD versus HDD

La principal diferencia entre una unidad de estado sólido (SSD) y una unidad de disco duro (HDD) es cómo se almacenan y se accede a los datos. Los HDD usan discos giratorios mecánicos y un cabezal móvil de lectura/escritura para acceder a los datos (latencia), mientras que los SSD usan chips de memoria mucho más rápidos, especialmente cuando se leen muchos archivos pequeños. Por lo tanto, si el precio no es un problema, las SSD son una mejor opción, especialmente porque las SSD modernas son casi tan confiables como las HDD.

Retomando la figura 1.1; ahora, leer esa pequeña cantidad de datos en la memoria es bastante rápido y relativamente trivial de escanear. Ahora, ¿qué pasa si los datos que estamos buscando no se pueden almacenar en caché por completo en la memoria? o el tiempo para leer todos los datos del disco está tardando demasiado?

Figura 1.2 Tabla grande que no cabe por completo en la memoria y está repartida por el disco.

Así que aquí es donde van la mayoría de los desarrolladores: he visto este problema antes; necesitamos algún diccionario (mapa hash) y una forma de llegar a la fila específica que estamos buscando sin tener que escanear el disco lento, leyendo toneladas de bloques para ver si los datos que necesitamos están ahí.

Estos se denominan nodos de hoja de índice a los que se les asigna una columna específica para indexar, pueden almacenar la ubicación de las filas coincidentes.

Estos nodos de hoja de índice son el mapeo entre la columna indexada y el lugar donde vive la fila correspondiente en el disco. Esto nos brinda una forma rápida de llegar a una fila específica si hace referencia a ella por columna indexada. Escanear el índice puede ser mucho más rápido ya que es una representación compacta (menos bytes) de la columna por la que está buscando. Le ahorra tiempo al leer un montón de bloques en busca de los datos solicitados y es mucho más conveniente almacenar en caché, lo que acelera aún más todo el proceso.

Nota: Bloques

En informática, los bloques son una agrupación de bytes que normalmente contienen un número fijo de registros que están limitados por una longitud total (longitud de bloque). Entonces, si tuviéramos que calcular la cantidad de bytes que se necesitarían para almacenar una fila dividida por la longitud del bloque, nos daría cuántas filas se pueden leer de un bloque específico.

En un nivel muy bajo, puede usar esto para razonar sobre el rendimiento de sus sistemas. Quick Maths™ puede ser muy poderoso cuando planifica la capacidad.

Retomando los nodos de hoja índice. Los beneficios aquí son dos: nos permite leer los nodos de la hoja del índice tanto hacia adelante como hacia atrás y reconstruir rápidamente la estructura del índice cuando eliminamos o agregamos nuevas filas, ya que solo estamos modificando punteros, cosas potentes.

Nota: Lista enlazada

Una lista enlazada es una colección lineal de elementos de datos cuyo orden no viene dado por su ubicación física en la memoria. En cambio, cada pieza apunta a la siguiente. Es una estructura de datos que consiste en una colección de nodos que representan una secuencia juntos. En su forma más básica, cada nodo contiene datos y una referencia (en otras palabras, un enlace) al siguiente nodo de la serie.

Árboles Balanceados (árboles B)

Así que quizás te preguntes dónde cometiste un gran error para encontrarte leyendo sobre B-Trees que odiabas de la escuela. Entiendo que estas cosas son aburridas, pero son poderosas y vale la pena entenderlas.

B+Trees nos permite construir una estructura de árbol donde cada nodo intermedio apunta al valor de nodo más alto de sus respectivos nodos hoja. Nos da una ruta clara para encontrar el nodo de hoja de índice que apuntará a los datos necesarios.

Esta estructura se construye de abajo hacia arriba para que un nodo intermedio cubra todos los nodos hoja hasta llegar al nodo raíz en la parte superior. Esta estructura de árbol obtiene su nombre equilibrado porque la profundidad es uniforme en todo el árbol.

Nota: Árbol B vs. Árbol B+

La principal diferencia que muestran los árboles B+ es que los nodos intermedios no almacenan ningún dato en ellos. En su lugar, todas las referencias de datos están vinculadas a los nodos hoja, lo que permite un mejor almacenamiento en caché de la estructura de árbol.

En segundo lugar, los nodos de hoja están vinculados, por lo que si necesita realizar un escaneo de índice, puede realizar un solo paso lineal en lugar de recorrer todo el árbol hacia arriba y hacia abajo y cargar más datos de índice desde el disco.

Escalabilidad logarítmica

Quiero tomar un breve aparte aquí para dar en el clavo con el poder de esta estructura. Por supuesto, la mayoría de los desarrolladores son conscientes del crecimiento exponencial de los datos e, idealmente, de las valoraciones de su empresa. Pero desafortunadamente, la escala de datos a menudo funciona en su contra, y los árboles balanceados son la primera herramienta en su arsenal contra esto.

Dependiendo de la cantidad de elementos a los que los nodos intermedios pueden hacer referencia (M) más la profundidad general del árbol (N), podemos hacer referencia a M a los N objetos.

Aquí hay una tabla que ilustra el concepto con un valor M de 5.

Entonces, a medida que la cantidad de nodos de hoja índice aumenta exponencialmente, la altura del árbol crece increíblemente lentamente (logarítmicamente) en relación con la cantidad de nodos de hoja índice. Esto, junto con la altura equilibrada del árbol, permite una identificación casi instantánea de los nodos de hoja de índice relevantes que apuntan a datos reales en el disco.

En la siguiente entrega hablaremos de transacciones.

--

--

I. N. Palacios

Enterprise Architect with 15+y in the use of languages and platforms, also 5+y designing tech solutions for finance, retail and e-commerce. SOA, MSA, EDA, Cloud