Los árboles B y los árboles B+ son casos especiales de árboles de
búsqueda.
Un árbol de búsqueda es un tipo de árbol que
sirve para guiar la búsqueda de un registro, dado el valor
de uno de sus campos.
Los índices multinivel de la sección anterior pueden
considerarse como variaciones de los árboles de búsqueda.
Cada bloque o nodo del índice multinivel puede tener hasta
valores del campo de indexación y
punteros.
Los valores del campo de indexación de cada nodo guían
al siguiente nodo (que se encuentra en otro nivel), hasta
llegar al bloque del fichero de datos que contiene el registro
deseado.
Al seguir un puntero, se va restringiendo la búsqueda en
cada nivel a un subárbol del árbol de búsqueda, y se
ignoran todos los nodos que no estén en dicho subárbol.
Los árboles de búsqueda difieren un poco de los índices
multinivel. Un árbol de búsqueda de orden
es un árbol
tal que cada nodo contiene como mucho
valores del campo
de indexación y
punteros:
Al buscar un valor
siempre se sigue el puntero
apropiado
de acuerdo con las condiciones de la segunda restricción.
Para insertar valores de búsqueda en el árbol y eliminarlos,
sin violar las restricciones anteriores, se utilizan algoritmos
que no garantizan que el árbol de búsqueda esté equilibrado
(que todas las hojas estén al mismo nivel).
Es importante mantener equilibrados los árboles de búsqueda
porque esto garantiza que no habrá nodos en niveles muy profundos
que requieran muchos accesos a bloques durante una búsqueda.
Además, las eliminaciones de registros pueden hacer que queden
nodos casi vacíos, con lo que hay un desperdicio de espacio
importante que también provoca un aumento en el número de niveles.
El árbol B es un árbol de búsqueda, con algunas restricciones adicionales, que resuelve hasta cierto punto los dos problemas anteriores. Estas restricciones adicionales garantizan que el árbol siempre estará equilibrado y que el espacio desperdiciado por la eliminación, si lo hay, nunca será excesivo. Los algoritmos para insertar y eliminar se hacen más complejos para poder mantener estas restricciones. No obstante, la mayor parte de las inserciones y eliminaciones son procesos simples, se complican sólo en circunstancias especiales: cuando se intenta insertar en un nodo que está lleno o cuando se intenta borrar en un nodo que está ocupado hasta la mitad.
Un árbol B de orden
se define del siguiente modo:
En un árbol B+ los punteros a datos se almacenan sólo en los nodos hoja del árbol, por lo cual, la estructura de los nodos hoja difiere de la de los nodos internos. Los nodos hoja tienen una entrada por cada valor del campo de indexación, junto con un puntero al registro del fichero de datos. Estos nodos están enlazados para ofrecer un acceso ordenado a los registros a través del campo de indexación. Los nodos hoja de un árbol B+ son similares al primer nivel (nivel base) de un índice. Los nodos internos del árbol B+ corresponden a los demás niveles del índice. Algunos valores del campo de indexación se repiten en los nodos internos del árbol B+ con el fin de guiar la búsqueda.
En un árbol B+ de orden
la estructura de un nodo interno
es la siguiente:
Como las entradas en los nodos internos de los árboles B+
contienen valores del campo de indexación y punteros a nodos
del árbol, pero no contienen punteros a los registros del
fichero de datos, es posible ``empaquetar" más entradas
en un nodo interno de un árbol B+ que en un nodo similar
de un árbol B. Por tanto, si el tamaño de bloque (nodo) es
el mismo, el orden
será mayor para el árbol B+ que para
el árbol B. Esto puede reducir el número de niveles del
árbol B+, mejorándose así el tiempo de acceso.
Como las estructuras de los nodos internos y los nodos hoja
de los árboles B+ son diferentes, su orden
puede ser
diferente.
Se ha demostrado por análisis y simulación que después de un gran número de inserciones y eliminaciones aleatorias en un árbol B, los nodos están ocupados en un 69% cuando se estabiliza el número de valores del árbol. Esto también es verdadero en el caso de los árboles B+. Si llega a suceder esto, la división y combinación de nodos ocurrirá con muy poca frecuencia, de modo que la inserción y la eliminación se volverán muy eficientes.
Cuando los árboles se definen sobre un campo no clave, los punteros a datos pasan a ser punteros a bloques de punteros a datos (se añade un nivel de indirección).