Árbol B detallado (1)

Introducción

Ya hemos hablado de muchos árboles, como árboles binarios ordinarios, montones binarios, árboles de búsqueda binaria, árboles binarios equilibrados, etc. Ahora hay una pregunta, ¿para qué se usan tantos árboles? De hecho, todo tiene la inevitabilidad del desarrollo, todo para solucionar problemas. A medida que la escala y la profundidad del problema continúan profundizándose, las soluciones correspondientes también han evolucionado. La mayoría de estos árboles sirven para resolver la eficiencia de la búsqueda o para garantizar el orden de los resultados de la búsqueda. En el escenario empresarial real, no es más que leer y escribir (eliminar y actualizar se considera escritura). En cuanto a las operaciones de escritura, la estabilidad es más importante. La escritura correcta es la primera prioridad y la velocidad de escritura es la segunda. Debido a que el flujo de origen de los datos de producción ciertamente no es muy grande, está bien dedicar más tiempo a escribir. Sin embargo, la lectura es la dirección de la búsqueda continua de la eficiencia. Los datos históricos continúan acumulándose. Demasiado lento para obtener datos afectará seriamente el rendimiento del sistema, y ​​será una verdadera sensación de experiencia para el usuario. Por lo tanto, en vista del problema de la eficiencia de lectura, se han desarrollado varias estructuras de datos para mejorar la eficiencia de búsqueda. Este es el proceso de evolución del árbol de búsqueda binario al árbol binario balanceado. Sabemos que la complejidad del tiempo de búsqueda del árbol binario balanceado ya es O (logN), pero en realidad es la más rápida. Sin embargo, los datos históricos deben almacenarse en el disco para evitar pérdidas. La E / S del disco también es un factor importante que afecta la eficiencia de la búsqueda. Con el advenimiento del big data, la escala de datos continúa expandiéndose, alcanzando millones, decenas de millones, miles de millones o incluso miles de millones. Disk IO se ha convertido en el principal cuello de botella de rendimiento en las búsquedas. Debido a que el almacenamiento del árbol binario balanceado en el disco no es continuo, el número de elementos leídos por E / S de disco es limitado, lo que conduce a un aumento en el número de E / S de disco, lo que afecta seriamente el rendimiento de búsqueda en su conjunto. La solución original ya no es adecuada para este escenario. Entonces hablaremos del árbol B del que vamos a hablar hoy para mejorar la eficiencia de búsqueda en escenarios de datos a gran escala.

Introducción

El árbol B es el árbol B. Debido a que el nombre original en inglés de B-tree es B-tree, y a muchas personas en China les gusta traducir B-tree como B-tree. De hecho, esta es una traducción literal muy mala, que es fácil de entender mal. Por ejemplo, la gente podría pensar que el árbol B es una especie de árbol y el árbol B es una especie de árbol. De hecho, B-tree se refiere a B-tree.
La aparición de árboles B sirve para salvar la enorme diferencia en la velocidad de acceso entre los diferentes niveles de almacenamiento y lograr una E / S eficiente. La eficiencia de búsqueda del árbol binario balanceado es muy alta y la eficiencia de búsqueda se puede mejorar reduciendo la profundidad del árbol. Sin embargo, cuando la cantidad de datos es muy grande, la cantidad de elementos almacenados en el árbol es limitada. Esto hará que la estructura del árbol de búsqueda binaria provoque lecturas y escrituras de E / S de disco demasiado frecuentes debido a la profundidad excesiva del árbol. resultando en una baja eficiencia de consulta. Además, la cantidad de datos es demasiado grande y el espacio de memoria no es suficiente para acomodar todos los nodos del árbol binario balanceado. B-tree es una buena estructura para resolver este problema

concepto

En primer lugar, el árbol B no debe confundirse con el árbol binario. En informática, el árbol B es de un tipo 自平衡树数据结构, y se mantiene 有序数据y se permite 以对数时间进行搜索,顺序访问,插入和删除. B-tree es una generalización del árbol de búsqueda binaria, porque un nodo puede tener más de dos nodos secundarios. A diferencia de otros árboles de búsqueda binaria autoequilibrados, los árboles B son muy adecuados para sistemas de almacenamiento que leen y escriben bloques de datos relativamente grandes (como discos ópticos). Se usa comúnmente en bases de datos y sistemas de archivos.

Partiendo del caso

El índice de la base de datos se almacena en el disco (por ejemplo, el motor InnoDB de mysql usa el árbol B + como estructura del árbol del índice, el árbol B + es una deformación del árbol B), cuando la cantidad de datos es relativamente grande, el tamaño del índice puede ser varios G aún más. Cuando usamos la consulta de índice, ¿podemos cargar el índice completo en la memoria? Obviamente imposible. Todo lo que podemos hacer es cargar cada página de disco una por una,这里的磁盘页对应这索引树的节点

Nota complementaria : la distribución del árbol de índices en el disco no es continua y está conectada por punteros de nodo. Disk IO tiene un mecanismo de lectura anticipada (que se mencionará específicamente a continuación). Cuando buscamos un nodo, cada IO de disco leído es una página de disco. La información del nodo está contenida en la página de disco, por lo que lo anterior dijo un disco La página corresponde a un nodo del árbol de índice. El tamaño de una página de disco está relacionado con el sistema operativo, generalmente 4K u 8K, por lo que el tamaño de la información contenida en un nodo no puede exceder el tamaño de una página de disco.
Inserte la descripción de la imagen aquí

Sabemos que la complejidad del tiempo de búsqueda de un árbol binario equilibrado es O (logN), entonces, ¿por qué no utilizar un árbol de búsqueda binario como estructura de índice? Cuando se utiliza un árbol binario balanceado, asumiendo que la altura del árbol es 4 y el valor a buscar es 10, el proceso es el siguiente:
árbol binario balanceado:
Inserte la descripción de la imagen aquí
primera búsqueda (primer disco IO, leer la primera página del disco, lo mismo abajo):
Inserte la descripción de la imagen aquí
… (proceso omitido)

E / S del cuarto disco: a
Inserte la descripción de la imagen aquí
partir de los resultados, en el peor de los casos, el número de E / S de disco es igual a la altura del árbol de índice.
En este momento, para mejorar la eficiencia de búsqueda, la dirección es construir menos IO de disco y cambiar la estructura de árbol "delgada" original en una estructura de árbol "en cuclillas" (es decir, reducir la altura del árbol, aumentar el número de elementos almacenados en cada nodo, y al mismo tiempo El tamaño del nodo no puede exceder el tamaño de la página del disco), que es una de las características del B-tree.

E / S de disco y lectura anticipada

Hemos estado hablando de E / S de disco anteriormente, aquí daremos una breve introducción.

计算机存储设备一般分为两种:
内存储器(main memory)和外存储器(external memory)

La memoria interna es la memoria interna, que tiene una velocidad de acceso a la memoria rápida, pero tiene una capacidad pequeña, es cara y no puede almacenar datos durante mucho tiempo (los datos desaparecerán cuando no se encienda la alimentación).

La memoria externa es la lectura del disco. El disco lee datos mediante un movimiento mecánico. El tiempo dedicado a leer datos cada vez se puede dividir en tres partes: tiempo de búsqueda, retardo de rotación y tiempo de transmisión. El tiempo de búsqueda se refiere al brazo magnético. El tiempo necesario para moverse a la pista especificada es generalmente inferior a 5 ms para los discos convencionales; el retraso de rotación es la velocidad de rotación del disco que escuchamos a menudo. Por ejemplo, un disco de 7200 revoluciones significa que puede girar 7200 veces por minuto, lo que significa que Puede rotar 120 veces por segundo. En segundo lugar, el retardo de rotación es 1/120/2 = 4,17 ms (el disco es un círculo, así que divídelo entre 2); el tiempo de transmisión se refiere al tiempo para leer del disco o escribir datos al disco, generalmente en unas pocas décimas de milisegundo, en relación con Las dos primeras veces se pueden ignorar. Entonces, el tiempo para acceder a un disco, es decir, el tiempo de una E / S de disco es de aproximadamente 5 + 4,17 = 9 ms, lo que suena bastante bien, pero debe saber que una máquina de 500 MIPS puede ejecutar 500 millones de instrucciones por segundo, porque el instrucciones Dependiendo de la naturaleza de la electricidad, en otras palabras, el tiempo para ejecutar un IO puede ejecutar 400.000 instrucciones, y la base de datos puede ejecutar fácilmente 100.000 millones o incluso decenas de millones de datos.Cada vez 9 milisegundos es obviamente un desastre. La siguiente figura es un cuadro comparativo de retrasos en el hardware de la computadora para su referencia:

Inserte la descripción de la imagen aquí
Teniendo en cuenta que la E / S de disco es una operación muy cara, el sistema operativo de la computadora ha realizado algunas optimizaciones. Cuando una E / S, no solo los datos de la dirección del disco actual, sino también los datos adyacentes también se leen en el búfer de memoria, debido a la El principio de lectura previa nos dice que cuando una computadora accede a los datos de una dirección, también se accederá rápidamente a los datos adyacentes. 每一次IO读取的数据我们称之为一页(page),也即磁盘页. La cantidad de datos en una página específica está relacionada con el sistema operativo, generalmente 4k u 8k, es decir, cuando leemos los datos en una página, realmente ocurre un IO. Esta teoría es muy útil para el diseño de la estructura de datos del índice. .

事实1 : 不同容量的存储器,访问速度差异悬殊。
  • Disco (nivel de ms) << memoria (nivel de ns), 100000 veces
  • Si el acceso a la memoria tarda 1 segundo, un acceso a la memoria externa tarda un día
  • Para evitar 1 acceso a la memoria externa, prefiero acceder a la memoria 100 veces ... así que guarde los datos más utilizados en la memoria más rápida
事实2 : 从磁盘中读 1 B,与读写 1KB 的时间成本几乎一样

De los datos anteriores se puede concluir en cierto sentido 索引查询的数据主要受限于硬盘的I/O速度,查询I/O次数越少,速度越快,所以B树的结构才应需求而生;B树的每个节点的元素可以视为一次I/O读取,树的高度表示最多的I/O次数,在相同数量的总元素个数下,每个节点的元素个数越多,高度越低,查询所需的I/O次数越少;假设,一次硬盘一次I/O数据为8K,索引用int(4字节)类型数据建立,理论上一个节点最多可以为2000个元素,2000*2000*2000=8000000000,80亿条的数据只需3次I/O(理论值),可想而知,B树做为索引的查询效率有多高:

También se puede ver同样的总元素个数,查询效率和树的高度密切相关

definición

El árbol B es un árbol equilibrado de múltiples ramas, generalmente decimos árbol B de orden m, es un árbol vacío o debe cumplir las siguientes condiciones:

  • Si la raíz no es un nodo hoja, entonces la raíz tiene al menos dos nodos secundarios (de lo contrario, se convertirá en una sola rama), con [1, m-1] elementos
  • Cada nodo intermedio (no el nodo raíz y el nodo hoja) contiene [math.ceil (m / 2) -1, m-1] elementos y [math.ceil (m / 2), m] nodos secundarios
  • Cada nodo hoja contiene elementos [math.ceil (m / 2) -1, m-1]
  • Cada nodo tiene como máximo m nodos secundarios.
  • Todos los nodos de hojas están en la misma capa (la misma altura).
  • Los elementos de cada nodo están ordenados de pequeños a grandes, y el k-1º elemento del nodo es exactamente la división de rango del elemento contenido en el kº hijo.

Nota:
math.ceil (x) es un entero ascendente que devuelve un número. Por ejemplo, math.ceil (1.2) devuelve 2.

Nota complementaria:

Agarre un punto:

En comparación con el árbol de búsqueda binaria, el árbol B necesita reducir la altura del árbol y aumentar la cantidad de elementos de nodo, por lo que cada nodo principal puede tener más de 2 nodos secundarios, y la cantidad de elementos por nodo ya no está limitada. a 1.

什么是B树的阶 ?
B树中所有节点的子节点数目的最大值,用m表示,假如最大值为10,则为10阶B树

Árbol B de cuarto orden
Inserte la descripción de la imagen aquí

B altura del árbol

¿Cuál es la altura máxima de un árbol B de nivel m que contiene N palabras clave en total?

log(m/2)(N+1)/2 + 1  ,log以(m/2)为低,(N+1)/2的对数再加1

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/csdniter/article/details/111589099
Recomendado
Clasificación