Was macht eine Datenbank tatsächlich, um herauszufinden, was mit einer select-Anweisung übereinstimmt?
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.
Wie interpretiert eine Datenbank einen Join anders als eine Abfrage mit mehreren "where key1 = key2" -Anweisungen?
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.
Wie speichert die Datenbank ihren gesamten Speicher?
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.
Wie werden Indizes gespeichert?
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.