Ich habe in den letzten Jahren mit Datenbanken gearbeitet und würde gerne glauben, dass ich mit deren Verwendung ziemlich kompetent geworden bin. Ich habe jedoch kürzlich über Joels Gesetz der undichten Abstraktionen gelesen und festgestellt, dass ich, obwohl ich eine Abfrage schreiben kann, um so ziemlich alles aus einer Datenbank herauszuholen, keine Ahnung habe, wie die Datenbank die Abfrage tatsächlich interpretiert. Kennt jemand gute Artikel oder Bücher, die erklären, wie Datenbanken intern funktionieren?
Einige spezifische Dinge, die mich interessieren, sind:
- Was macht eine Datenbank tatsächlich, um herauszufinden, was mit einer select-Anweisung übereinstimmt?
- Wie interpretiert eine Datenbank einen Join anders als eine Abfrage mit mehreren "where key1 = key2" -Anweisungen?
- Wie speichert die Datenbank ihren gesamten Speicher?
- Wie werden Indizes gespeichert?
Antworten:
Um ehrlich zu sein, ist es eine Frage der rohen Gewalt. Es liest einfach jeden Kandidatendatensatz in der Datenbank durch und ordnet den Ausdruck den Feldern zu. Wenn Sie also "select * from table where name = 'fred'" haben, durchläuft es buchstäblich jeden Datensatz, greift nach dem Feld "name" und vergleicht es mit "fred".
Wenn nun das Feld "table.name" indiziert ist, verwendet die Datenbank (wahrscheinlich, aber nicht unbedingt) zuerst den Index, um die Kandidatendatensätze zu finden, auf die der eigentliche Filter angewendet werden soll.
Dies reduziert die Anzahl der Kandidatendatensätze, auf die der Ausdruck angewendet werden soll, andernfalls wird nur das ausgeführt, was wir als "Tabellenscan" bezeichnen, dh jede Zeile lesen.
Grundsätzlich ist die Lokalisierung der Kandidatendatensätze jedoch unabhängig von der Anwendung des tatsächlichen Filterausdrucks, und natürlich können einige clevere Optimierungen vorgenommen werden.
Nun, ein Join wird verwendet, um eine neue "Pseudotabelle" zu erstellen, auf die der Filter angewendet wird. Sie haben also die Filterkriterien und die Verknüpfungskriterien. Die Verknüpfungskriterien werden verwendet, um diese "Pseudotabelle" zu erstellen, und dann wird der Filter darauf angewendet. Bei der Interpretation des Joins ist es wieder dasselbe Problem wie bei den Filter-Brute-Force-Vergleichen und Index-Lesevorgängen, um die Teilmenge für die "Pseudotabelle" zu erstellen.
Einer der Schlüssel zu einer guten Datenbank ist die Verwaltung der E / A-Puffer. Grundsätzlich werden RAM-Blöcke jedoch mit Plattenblöcken abgeglichen. Mit den modernen virtuellen Speichermanagern kann sich eine einfachere Datenbank fast auf die VM als Speicherpuffermanager verlassen. Die High-End-DBs machen das alles selbst.
B + Bäume sollten Sie normalerweise nachschlagen. Es ist eine einfache Technik, die es schon seit Jahren gibt. Der Vorteil wird mit den meisten ausgeglichenen Bäumen geteilt: Konsistenter Zugriff auf die Knoten sowie alle Blattknoten sind miteinander verbunden, sodass Sie problemlos in Schlüsselreihenfolge von Knoten zu Knoten wechseln können. Mit einem Index können die Zeilen für bestimmte Felder in der Datenbank als "sortiert" betrachtet werden, und die Datenbank kann diese Informationen für Optimierungen nutzen. Dies unterscheidet sich beispielsweise von der Verwendung einer Hash-Tabelle für einen Index, mit der Sie nur schnell zu einem bestimmten Datensatz gelangen. In einem B-Tree gelangen Sie schnell nicht nur zu einem bestimmten Datensatz, sondern zu einem Punkt innerhalb einer sortierten Liste.
Die eigentlichen Mechanismen zum Speichern und Indizieren von Zeilen in der Datenbank sind sehr einfach und gut verstanden. Das Spiel verwaltet Puffer und konvertiert SQL in effiziente Abfragepfade, um diese grundlegenden Speichersprachen zu nutzen.
Hinzu kommt die Komplexität von Mehrbenutzern, Sperren, Protokollieren und Transaktionen zusätzlich zur Speichersprache.
quelle
Was macht eine Datenbank tatsächlich, um herauszufinden, was mit einer select-Anweisung übereinstimmt?
DBs verwenden Indizes (siehe unten)
Wie interpretiert eine Datenbank einen Join anders als eine Abfrage mit mehreren "where key1 = key2" -Anweisungen? Join-Operationen können durch Zusammenführen von Bäumen in binäre Baumoperationen übersetzt werden.
Wie speichert die Datenbank ihren gesamten Speicher?
Speicherzuordnungsdateien für einen schnelleren Zugriff auf ihre Daten
Wie werden Indizes gespeichert?
Intern arbeiten DBs mit B-Trees für die Indizierung.
Dies sollte auf Wikipedia näher erläutert werden.
http://en.wikipedia.org/wiki/B-tree
http://en.wikipedia.org/wiki/Database
quelle
Zusätzlich zum Lesen kann es hilfreich sein, die DB-Tools zu verwenden, um den Ausführungsplan zu untersuchen, den die Datenbank für Ihre Abfragen verwendet. Sie erhalten nicht nur einen Einblick in die Funktionsweise, sondern können auch mit Techniken experimentieren, um die Abfragen mit einer besseren Rückkopplungsschleife zu optimieren.
quelle
Saif, ausgezeichnete Verbindung. Eine Übersicht aus der Vogelperspektive, die die meisten Themen abdeckt und Details zu bestimmten Anbieterimplementierungen bereitstellt.
Ich habe drei Versuche unternommen, eine Erklärung zu schreiben, aber das ist wirklich ein zu großes Thema. Lesen Sie den Hellerstein-Artikel (den auf dem Berkeley-Server, mit dem Saif verlinkt hat) und fragen Sie dann nach Einzelheiten.
Es ist erwähnenswert, dass in einem bestimmten DBMS nur eine Teilmenge der "bekannten guten Ideen" implementiert ist. Zum Beispiel führt SQLite nicht einmal Hash-Joins durch, sondern nur verschachtelte Schleifen (ack !!). Aber dann ist es eine leicht einbettbare Datenbank, und sie macht ihre Arbeit sehr gut, also gibt es etwas zu sagen für die mangelnde Komplexität.
Das Erlernen, wie ein DBMS Statistiken sammelt und wie es sie zum Erstellen von Abfrageplänen verwendet, sowie das Lesen der Abfragepläne sind von unschätzbarem Wert - wenn Sie ein Thema für "Datenbankinternale" auswählen müssen lerne, lerne das. Es wird einen großen Unterschied machen (und Sie werden nie wieder versehentlich ein kartesisches Produkt schreiben ... ;-)).
quelle
Wenn Sie mehr darüber erfahren möchten, würde ich empfehlen, die SQLite-Quellen zu erwerben und einen Blick darauf zu werfen, wie dies funktioniert. Es ist vollständig, wenn auch nicht im Maßstab der größeren Open Source- und kommerziellen Datenbanken. Wenn Sie mehr darüber erfahren möchten, empfehle ich The Definitive Guide to SQLite, das nicht nur eine gute Erklärung für SQLite darstellt , sondern auch eines der am besten lesbaren technischen Bücher ist, die ich kenne. Auf der MySQL-Seite können Sie sowohl vom MySQL Performance Blog als auch von der O'Reilly High Performance MySQL (V2) lernen, deren einer der Autoren der Blog ist.
quelle