with structuring how data cross database reference internals

database - structuring - ¿Cómo funcionan las bases de datos internamente?



mongodb structure data (5)

¿Qué hace una base de datos para averiguar qué coincide con una declaración seleccionada?

Para ser franco, es una cuestión de fuerza bruta. Simplemente, lee cada registro candidato en la base de datos y coincide con la expresión de los campos. Entonces, si tiene "select * from table where name = ''fred''", literalmente recorre cada registro, toma el campo "name" y lo compara con ''fred''.

Ahora, si el campo "table.name" está indexado, la base de datos (probablemente, pero no necesariamente) usará el índice primero para ubicar los registros candidatos para aplicar el filtro real.

Esto reduce el número de registros candidatos para aplicar la expresión, de lo contrario solo hará lo que llamamos "exploración de tabla", es decir, leer cada fila.

Pero fundamentalmente, como quiera que localice los registros de candidatos, es independiente de cómo aplica la expresión de filtro real, y, obviamente, hay algunas optimizaciones inteligentes que se pueden hacer.

¿Cómo interpreta una base de datos un join de manera diferente a una consulta con varias instrucciones "where key1 = key2"?

Bueno, una unión se usa para crear una nueva "pseudo tabla", sobre la cual se aplica el filtro. Entonces, tiene los criterios de filtro y los criterios de unión. El criterio de unión se usa para construir esta "pseudo tabla" y luego el filtro se aplica contra eso. Ahora, al interpretar la unión, vuelve a ser el mismo problema que el filtro: comparaciones de fuerza bruta y lecturas de índice para construir el subconjunto para la "pseudo tabla".

¿Cómo almacena la base de datos toda su memoria?

Una de las claves de una buena base de datos es cómo gestiona sus búferes de E / S. Pero básicamente combina bloques de RAM con bloques de disco. Con los administradores de memoria virtual modernos, una base de datos más simple casi puede confiar en la VM como su administrador de búfer de memoria. Los DB''s de gama alta hacen todo esto ellos mismos.

¿Cómo se almacenan los índices?

B + Trees típicamente, deberías buscarlo. Es una técnica directa que ha existido durante años. Su beneficio se comparte con la mayoría de los árboles balanceados: acceso consistente a los nodos, además de que todos los nodos hoja están vinculados para que pueda pasar fácilmente de un nodo a otro en el orden de las teclas. Entonces, con un índice, las filas se pueden considerar "ordenadas" para campos específicos en la base de datos, y la base de datos puede aprovechar esa información para beneficiarse de las optimizaciones. Esto es distinto de, por ejemplo, usar una tabla hash para un índice, que solo le permite acceder rápidamente a un registro específico. En un B-Tree puede obtener rápidamente no solo un registro específico, sino también un punto dentro de una lista ordenada.

La mecánica real de almacenar e indexar las filas en la base de datos es bastante sencilla y bien entendida. El juego está gestionando búferes y convirtiendo SQL en rutas de consulta eficientes para aprovechar estas expresiones básicas de almacenamiento.

Luego, está toda la complejidad de múltiples usuarios, bloqueo, registro y transacciones además de la expresión de almacenamiento.

He estado trabajando con bases de datos durante los últimos años y me gustaría pensar que me he vuelto bastante competente con su uso. Sin embargo, estuve leyendo recientemente sobre la Ley de extracciones defectuosas de Joel y me di cuenta de que, aunque puedo escribir una consulta para obtener prácticamente todo lo que quiero de una base de datos, no tengo idea de cómo la base de datos realmente interpreta la consulta. ¿Alguien sabe de algún buen artículo o libro que explique cómo funcionan las bases de datos internamente?

Algunas cosas específicas que me interesan son:

  • ¿Qué hace una base de datos para averiguar qué coincide con una declaración seleccionada?
  • ¿Cómo interpreta una base de datos un join de manera diferente a una consulta con varias instrucciones "where key1 = key2"?
  • ¿Cómo almacena la base de datos toda su memoria?
  • ¿Cómo se almacenan los índices?

Además de leer, puede resultar instructivo utilizar las herramientas de DB para examinar el plan de ejecución que la base de datos utiliza en sus consultas. Además de obtener una idea de cómo está funcionando, puede experimentar con técnicas para optimizar las consultas con un mejor ciclo de retroalimentación.


Saif, excelente enlace. Visión general de un ojo de pájaro que logra cubrir la mayoría de los temas y proporciona detalles sobre implementaciones específicas de los proveedores.

Hice tres intentos para escribir una explicación, pero este es un tema demasiado grande. Vea el artículo de Hellerstein (el del servidor de Berkeley al que Saif se vinculó), y luego pregunte sobre detalles.

Vale la pena señalar que solo se implementa un subconjunto de "buenas ideas conocidas" en cualquier DBMS dado. Por ejemplo, SQLite ni siquiera hace combinaciones de hash, solo hace bucles anidados (¡ack!). Pero entonces, se trata de un dbms fácilmente integrable, y hace su trabajo muy bien, por lo que hay algo que decir acerca de la falta de complejidad.

Aprender cómo un SGBD recopila estadísticas y cómo las usa para construir planes de consulta, así como también aprender a leer los planes de consulta en primer lugar, es una habilidad invaluable; si tiene que elegir un tema de "base de datos interna" para aprende, aprende esto Hará una gran diferencia (y nunca más escribirás accidentalmente un producto cartesiano ... ;-)).


Si quieres saber más en detalle, te recomiendo obtener las fuentes de sqlite y echar un vistazo a cómo lo hace. Está completo, aunque no a escala de las bases de datos comerciales y de código abierto más grandes. Si quieres saber más en detalle, recomiendo The Definitive Guide to SQLite, que no es solo una gran explicación de sqlite, sino también uno de los libros técnicos más legibles que conozco. En el lado de MySQL, puede aprender de MySQL Performance Blog y en el frente del libro el O''Reilly High Performance MySQL (V2) del cual el blog es uno de los autores.


  • ¿Qué hace una base de datos para averiguar qué coincide con una declaración seleccionada?

    Los DB están usando índices (ver a continuación)

  • ¿Cómo interpreta una base de datos un join de manera diferente a una consulta con varias instrucciones "where key1 = key2"? Unir operaciones se puede traducir a operaciones de árbol binario mediante la fusión de árboles.

  • ¿Cómo almacena la base de datos toda su memoria?

    archivos de mapa de memoria para un acceso más rápido de sus datos

  • ¿Cómo se almacenan los índices?

    Internamente los DB están trabajando con B-Trees para indexar.

Esto debe ser explicado en mayor detalle en Wikipedia.

http://en.wikipedia.org/wiki/B-tree

http://en.wikipedia.org/wiki/Database