Pracuję z bazami danych od kilku lat i chciałbym myśleć, że jestem dość kompetentny w ich używaniu. Jednak ostatnio czytałem o prawie nieszczelnych abstrakcji Joela i zdałem sobie sprawę, że chociaż mogę napisać zapytanie, aby uzyskać z bazy danych prawie wszystko, czego chcę, nie mam pojęcia, jak baza danych faktycznie interpretuje zapytanie. Czy ktoś zna jakieś dobre artykuły lub książki, które wyjaśniają, jak wewnętrznie działają bazy danych?
Niektóre konkretne rzeczy, które mnie interesują, to:
- Co właściwie robi baza danych, aby dowiedzieć się, co pasuje do instrukcji select?
- W jaki sposób baza danych interpretuje złączenie inaczej niż zapytanie z kilkoma instrukcjami „gdzie klucz1 = klucz2”?
- Jak baza danych przechowuje całą swoją pamięć?
- Jak przechowywane są indeksy?
Odpowiedzi:
Mówiąc szczerze, to kwestia brutalnej siły. Po prostu czyta każdy rekord kandydata w bazie danych i dopasowuje wyrażenie do pól. Tak więc, jeśli masz „select * from table, gdzie name = 'fred'”, dosłownie przechodzi przez każdy rekord, pobiera pole „name” i porównuje je z „fred”.
Teraz, jeśli pole „table.name” jest indeksowane, baza danych (prawdopodobnie, ale niekoniecznie) użyje najpierw indeksu do zlokalizowania rekordów kandydatów, do których ma zastosować właściwy filtr.
Zmniejsza to liczbę rekordów kandydatów, do których ma zostać zastosowane wyrażenie, w przeciwnym razie wykona to, co nazywamy „skanowaniem tabeli”, tj. Przeczyta każdy wiersz.
Zasadniczo jednak lokalizowanie rekordów kandydatów jest niezależne od tego, w jaki sposób stosuje rzeczywiste wyrażenie filtru i, oczywiście, można wykonać kilka sprytnych optymalizacji.
Cóż, złączenie służy do utworzenia nowej „pseudo tablicy”, do której stosowany jest filtr. Masz więc kryteria filtru i kryteria łączenia. Kryteria łączenia są używane do budowania tej „pseudo tabeli”, a następnie filtr jest stosowany względem niej. Teraz, gdy interpretujemy sprzężenie, znowu jest to ten sam problem, co w przypadku filtra - brutalne porównania siły i odczyty indeksów w celu zbudowania podzbioru dla „pseudo tabeli”.
Jednym z kluczy do dobrej bazy danych jest sposób, w jaki zarządza ona swoimi buforami we / wy. Ale w zasadzie dopasowuje bloki RAM do bloków dysku. Dzięki nowoczesnym menedżerom pamięci wirtualnej prostsza baza danych może prawie polegać na maszynie wirtualnej jako na menedżerze bufora pamięci. Wysokiej klasy DB robią to wszystko samodzielnie.
B + Drzewa zazwyczaj powinieneś to sprawdzić. To prosta technika, która istnieje od lat. Jego korzyść jest wspólna z większością każdego zrównoważonego drzewa: spójny dostęp do węzłów oraz wszystkie węzły liści są połączone, dzięki czemu można łatwo przechodzić od węzła do węzła w kolejności kluczy. Dzięki indeksowi wiersze można traktować jako „posortowane” pod kątem określonych pól w bazie danych, a baza danych może wykorzystać te informacje do optymalizacji. Różni się to od, powiedzmy, używania tablicy skrótów dla indeksu, która pozwala tylko szybko dostać się do określonego rekordu. W B-Tree można szybko dotrzeć nie tylko do konkretnego rekordu, ale także do punktu na posortowanej liście.
Rzeczywista mechanika przechowywania i indeksowania wierszy w bazie danych jest bardzo prosta i dobrze zrozumiana. Gra zarządza buforami i konwertuje SQL na wydajne ścieżki zapytań, aby wykorzystać te podstawowe idiomy przechowywania.
Następnie istnieje cała złożoność wielu użytkowników, blokowanie, rejestrowanie i złożoność transakcji na szczycie idiomu przechowywania.
źródło
Co właściwie robi baza danych, aby dowiedzieć się, co pasuje do instrukcji select?
Bazy danych używają indeksów (patrz poniżej)
W jaki sposób baza danych interpretuje złączenie inaczej niż zapytanie z kilkoma instrukcjami „gdzie klucz1 = klucz2”? Operacje łączenia można przetłumaczyć na operacje drzewa binarnego poprzez scalenie drzew.
Jak baza danych przechowuje całą swoją pamięć?
pliki mapowane w pamięci, aby uzyskać szybszy dostęp do ich danych
Jak przechowywane są indeksy?
Wewnętrzne bazy danych współpracują z B-drzewami do indeksowania.
Należy to wyjaśnić bardziej szczegółowo na Wikipedii.
http://en.wikipedia.org/wiki/B-tree
http://en.wikipedia.org/wiki/Database
źródło
Oprócz czytania pouczające może być użycie narzędzi bazy danych do zbadania planu wykonania używanego przez bazę danych w zapytaniach. Oprócz uzyskania wglądu w to, jak to działa, możesz eksperymentować z technikami optymalizacji zapytań z lepszą pętlą sprzężenia zwrotnego.
źródło
Saif, doskonały link. Omówienie z lotu ptaka, które obejmuje większość tematów i zawiera szczegółowe informacje na temat wdrożeń określonych dostawców.
Podjąłem trzy próby napisania wyjaśnienia, ale to naprawdę zbyt duży temat. Przeczytaj artykuł o Hellersteinie (ten na serwerze berkeley, z którym łączył się Saif), a następnie zapytaj o szczegóły.
Warto zauważyć, że tylko podzbiór „znanych dobrych pomysłów” jest zaimplementowany w danym DBMS. Na przykład SQLite nie wykonuje nawet połączeń mieszających, wykonuje tylko zagnieżdżone pętle (potwierdzenie !!). Ale z drugiej strony jest to łatwo osadzalny dbms, który działa bardzo dobrze, więc jest coś do powiedzenia o braku złożoności.
Nauczenie się, w jaki sposób DBMS gromadzi statystyki i jak używa ich do konstruowania planów zapytań, a także nauczenie się, jak czytać plany zapytań w pierwszej kolejności, jest nieocenioną umiejętnością - jeśli musisz wybrać jeden temat „wewnętrzne bazy danych” do uczyć się, uczyć się tego. To zrobi wielką różnicę (i już nigdy nie napiszesz przypadkowo produktu kartezjańskiego ... ;-)).
źródło
Jeśli chcesz dowiedzieć się więcej szczegółów, polecam pobranie źródeł sqlite i przyjrzenie się, jak to robi. Jest kompletny, choć nie w skali większych baz danych open source i komercyjnych. Jeśli chcesz dowiedzieć się więcej szczegółów, polecam The Definitive Guide to SQLite, który jest nie tylko świetnym wyjaśnieniem sqlite, ale także jedną z najbardziej czytelnych książek technicznych, jakie znam. Jeśli chodzi o MySQL, możesz się dowiedzieć z MySQL Performance Blog, a także z książki O'Reilly High Performance MySQL (V2), której blog jest jednym z autorów.
źródło