Was macht eine Datenbank tatsächlich zu herauszufinden, was eine ausgewählte Anweisung übereinstimmt?
Um ehrlich zu sein, ist es eine Frage der rohen Gewalt. Es liest einfach jeden Kandidaten-Datensatz in der Datenbank durch und passt den Ausdruck den Feldern an. Wenn Sie also "* aus der Tabelle auswählen, in der name = 'fred'" ist, durchläuft es buchstäblich jeden Datensatz, ruft das Feld "name" ab und vergleicht es mit "fred".
Nun, wenn das Feld "table.name" indiziert ist, wird die Datenbank (wahrscheinlich, aber nicht unbedingt) den Index zuerst verwenden, um die Kandidaten-Datensätze zu finden, auf die der eigentliche Filter angewendet wird.
Dies reduziert die Anzahl der Kandidaten-Datensätze, auf die der Ausdruck angewendet werden soll, sonst wird es einfach das tun, was wir einen "Tabellen-Scan" nennen, d.h. jede Zeile lesen.
Aber im Grunde, aber es findet die Kandidaten Datensätze getrennt von, wie es den tatsächlichen Filterausdruck anwendet, und offensichtlich gibt es einige schlaue Optimierungen, die getan werden können.
Wie funktioniert eine Datenbank ein anders auf eine Abfrage mit mehreren „wo key1 = key2“ Aussagen kommen interpretieren?
Nun, ein Join wird verwendet, um eine neue "Pseudo-Tabelle" zu erstellen, auf die der Filter angewendet wird. Sie haben also die Filterkriterien und die Verknüpfungskriterien. Die Join-Kriterien werden verwendet, um diese "Pseudo-Tabelle" zu erstellen, und dann wird der Filter darauf angewendet. Nun, bei der Interpretation des Joins, ist es wieder das gleiche Problem wie beim Filter - Brute-Force-Vergleiche und Index-Lesevorgänge, um die Teilmenge für die "Pseudo-Tabelle" zu erstellen.
Wie speichert die Datenbank alle ihre Speicher?
Einer der Schlüssel zu einer guten Datenbank ist, wie es seine I/O-Puffer verwaltet. Aber es entspricht im Wesentlichen RAM-Blöcke mit Festplattenblöcken. Mit den modernen virtuellen Speichermanagern kann eine einfachere Datenbank fast auf die VM als ihren Speicherpuffermanager zurückgreifen. Die High-End-DBs machen das alles selbst.
Wie werden Indizes gespeichert?
B + Bäume normalerweise sollten Sie nachschlagen. Es ist eine geradlinige Technik, die es seit Jahren gibt. Der Vorteil liegt in den meisten ausgeglichenen Strukturen: Der konsistente Zugriff auf die Knoten und alle Blattknoten sind miteinander verknüpft, sodass Sie in der Reihenfolge der Schlüssel von Knoten zu Knoten navigieren 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 von der Verwendung einer Hashtabelle für einen Index, mit der Sie nur schnell zu einem bestimmten Datensatz gelangen. In einem B-Tree können Sie schnell nicht nur zu einem bestimmten Datensatz gelangen, sondern zu einem Punkt innerhalb einer sortierten Liste.
Die eigentliche Mechanik des Speicherns und Indexierens von Zeilen in der Datenbank ist wirklich ziemlich geradlinig und gut verstanden. Das Spiel verwaltet Puffer und konvertiert SQL in effiziente Abfragepfade, um diese grundlegenden Speicher-Idiome zu nutzen.
Dann gibt es die gesamte Multi-User-, Sperr-, Protokollierungs- und Transaktionskomplexität auf dem Speicher-Idiom.
Ab 2015 gibt es einen [diesen Artikel] (http://coding-geek.com/how-databases-work/), der ziemlich gut scheint. – Piovezan
Probieren Sie http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf und die WikiPedia aus. Dies ist ein bisschen ein großes Thema und Modelle wie RDBMS, FLATFILE etc. Der Parser ist wirklich eine der wichtigsten Komponenten. Danke –
Wenn es SQL-Server ist, empfehle ich die Inside Microsoft SQL Server 2005-Serie (Microsoft Press) vor allem die Storage Engine und auf Abfragen .. Es beantwortet alle Ihre Fragen und vieles mehr. Sie könnten sich für einige dieser Blogs interessieren: [Craig Freedman] (http://blogs.msdn.com/craigfr/) [Kalen Delaney] (http://sqlblog.com/blogs/kalen_delaney/) Es lohnt sich, [ SQLServerCentral] (http://www.sqlservercentral.com/) too .. –