¿QUÉ SON LOS ÍNDICES B-TREE EN MYSQL Y POR QUÉ SON TAN IMPORTANTES?

Un índice B-Tree, Balanced Tree, es una estructura de datos de árbol balanceado diseñada específicamente para sistemas de almacenamiento en disco. Su objetivo principal: minimizar el número de accesos a disco al realizar búsquedas.

Características

  • Cada nodo puede tener múltiples hijos (no es un árbol binario).
  • Todos los nodos hoja están al mismo nivel (balanceado).
  • Las operaciones de búsqueda, inserción y eliminación son O(log n).

¿Cómo funciona en MySQL (InnoDB)?

  • En InnoDB todos los índices son B+ Tree
  • Los nodos internos contienen solo claves (para guiar la búsqueda).
  • Los nodos hoja contienen las claves + los datos (en índices primarios) o claves + puntero (en índices secundarios).
  • Los nodos hoja están enlazados entre sí, lo que permite recorridos muy eficientes en rangos (BETWEEN, >, <, ORDER BY, etc.).

Ventajas de los índices B-Tree

  • Excelente rendimiento en búsquedas por igualdad (=) y por rango.
  • Muy buenos para ORDER BY y GROUP BY.
  • Soporta consultas que usan prefijos de la clave.
  • Mantiene los datos ordenados.

Ejemplo

CREATE TABLE usuarios ( id BIGINT PRIMARY KEY, -- Índice B-Tree automático email VARCHAR(255) UNIQUE, -- Otro B-Tree apellido VARCHAR(100), fecha_registro DATE, INDEX idx_apellido_fecha (apellido, fecha_registro) -- Índice compuesto B-Tree );
Este índice compuesto sirve para consultas como:
  • WHERE apellido = 'García'
  • WHERE apellido = 'García' AND fecha_registro > '2025-01-01'
  • Pero no sirve para WHERE fecha_registro = '2025-01-01,ya que el índice ordena primero por apellido y dentro de cada apellido, ordena por fecha_registro..

Cuándo crear índices B-Tree

  • Columnas que uses frecuentemente en WHERE, JOIN, ORDER BY o GROUP BY.
  • Claves foráneas.
  • Columnas con alta cardinalidad (muchos valores distintos).
  • Evitar indexar columnas con baja cardinalidad (ej: género, estado con pocos valores).

    Ver el índice B-Trees

    EXPLAIN SELECT * FROM usuarios WHERE apellido = 'García';
    -- Busca "type: ref" o "range" y "key" con el nombre del índice