2008-10-06 18 views
67

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 Joel's Law of Leaky Abstractions y me di cuenta de que, aunque puedo escribir una consulta para obtener casi 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?¿Cómo funcionan las bases de datos internamente?

Entre las cosas que me interesan son:

  • ¿Qué hacer realidad una base de datos para averiguar lo que coincide con una instrucción de selección?
  • ¿Cómo interpreta una base de datos una combinación de forma diferente a una consulta con varias instrucciones "where key1 = key2"?
  • ¿Cómo almacena la base de datos toda la memoria?
  • ¿Cómo se almacenan los índices?
+1

A partir de 2015, hay un [este artículo] (http://coding-geek.com/how-databases-work/) que parece bastante bueno. – Piovezan

+0

Pruebe esto http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf y la WikiPedia. Este es un gran tema y modelos como RDBMS, FLATFILE, etc. El analizador es realmente uno de los componentes más importantes. Gracias –

+0

Si es un servidor SQL, recomiendo encarecidamente la serie Inside Microsoft SQL Server 2005 (Microsoft press) especialmente el motor de almacenamiento y las consultas ... Responde todas sus preguntas y mucho más. Puede que le interesen algunos de estos blogs: [Craig Freedman] (http://blogs.msdn.com/craigfr/) [Kalen Delaney] (http://sqlblog.com/blogs/kalen_delaney/) Merece la pena suscribirse a [ SQLServerCentral] (http://www.sqlservercentral.com/) también .. –

Respuesta

65

¿Qué hacer realidad una base de datos a averiguar lo que coincide con un selecto declaración?

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, entonces la base de datos usará (probablemente, pero no necesariamente) 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, sin embargo, ubica los registros candidatos es independiente de cómo se aplica la expresión de filtro real, y, obviamente, hay algunas optimizaciones inteligentes que se pueden hacer.

¿Cómo interpreta una base de datos una unión de manera diferente a una consulta con varios declaraciones "donde key1 = clave2"?

Bueno, una unión se utiliza para hacer una nueva "pseudo tabla", sobre la que 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 para 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 + Árboles normalmente, se debe mirar hacia arriba. 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 filas en la base de datos es realmente bastante directa 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.

+5

Solo quería decir que esta es una respuesta realmente interesante y útil. ¿Has escrito más sobre este tema en alguna parte? –

4
  • ¿Qué hacer realidad una base de datos para averiguar lo que coincide con una instrucción de selección?

    DBs están utilizando índices (ver más abajo)

  • ¿Cómo interpreta una base de datos una unión diferente a una consulta con varias declaraciones "donde key1 = clave2"? Unir operaciones se puede traducir a operaciones de árbol binario mediante la fusión de árboles.

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

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

  • ¿Cómo se almacenan los índices?

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

esto se debe explicar con mayor detalle en la wikipedia ..

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

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

0

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 DBMS recopila estadísticas y cómo las usa para construir planes de consulta, así como aprender a leer los planes de consulta en primer lugar, es una habilidad invaluable, si tiene que elegir una "base de datos" internals "topic para aprender, aprende esto. Hará una gran diferencia (y nunca más escribirás accidentalmente un producto cartesiano ... ;-)).

1

Además de leer, puede resultar instructivo utilizar las herramientas de base de datos 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.

0

Si desea saber más en detalle, le 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, así como en el frente del libro O'Reilly High Performance MySQL (V2) del cual el blog es uno de los autores.

Cuestiones relacionadas