Ich habe über Skip-Listen und MemSQL gelesen und habe mich gefragt, warum Skip-Listen in Datenbanken nicht häufiger verwendet werden? Gibt es große Nachteile bei der Verwendung von Skip-Listen?Warum werden Skip-Listen gegenüber B + -Bäumen für Datenbanken nicht bevorzugt?
Antwort
Datenbanken sind in der Regel so groß, dass sie in einem externen Speicher wie einem riesigen Laufwerk gespeichert werden müssen. Daher ist der Flaschenhals bei den meisten Datenbankanwendungen die Häufigkeit, mit der wir eine Speicherübertragung vom Plattenlaufwerk in den Hauptspeicher durchführen müssen.
B-Bäume und ihre Varianten wurden speziell entwickelt, um die Anzahl der Lese- und Schreibvorgänge zu minimieren, die für die Ausführung der einzelnen Operationen erforderlich sind. Mathematisch ist die Anzahl der für jede B-Baum-Operation erforderlichen Speicherübertragungen O (log n/log B), wobei B die Blockgröße ist. Vergleichen Sie dies mit einer Auslagerungsliste, die O (log n) Speicherübertragungen nach Erwartung erfordert. Da B normalerweise in Megabyte gemessen wird, kann Log B in der Nähe von 15 bis 25 liegen, so dass der B-Baum wesentlich schneller sein kann. Selbst wenn sich die Datenbank im Hauptspeicher befindet, kann der Effekt der Speicherhierarchie (L1- und L2-Caches usw.) so ausgeprägt sein, dass B-Baum-Varianten in der Praxis immer noch schneller sind als viele andere Datenstrukturen. This Google blog post gibt einige Hintergrundinformationen dazu.
Obwohl jede Operation in einem B-Baum normalerweise mehr CPU-Arbeit erfordert als entsprechende Operationen in anderen Datenstrukturen, macht die Tatsache, dass sie so wenig Speichertransfers erfordern, sie in der Praxis wesentlich schneller als andere Datenstrukturen. Daher wäre es nicht ratsam, eine Überspringungsliste in einer Datenbank zu verwenden.
Es gibt noch einen anderen Grund, warum B-Bäume nett sind: Sie sind im schlechtesten Fall effizient. Obwohl deterministische Ausblendungslisten existieren, sind die meisten Ausdehnungslisten-Implementierungen randomisiert und geben erwartete Garantien für ihr Verhalten. In einer Datenbank ist dies möglicherweise inakzeptabel, da viele Anwendungsfälle in Datenbanken ein effizientes Verhalten im ungünstigsten Fall erfordern.
Hoffe, das hilft!
Obwohl es spät im Spiel war, aber ich verspürte den Drang, als seine bestbewertete Antwort zu antworten und vielleicht keine vollständige Nachricht zu vermitteln.
Skip-Listen unterscheiden sich von der Balanced-Tree-Datenstruktur, da mehrere Listen effizient kombiniert werden können. In Datenbankbegriffen erlaubt es Indizes, die auf Sprunglisten basieren, effizient zu kombinieren. Ein gutes Beispiel ist Lucene, das Suchmaschinen wie Solr/ElasticSeach antreibt. https://issues.apache.org/jira/browse/LUCENE-866.
B-Tree hat Probleme bei der Kombination mehrerer Indizes, ohne die gesamte a-priori-Kombination zu indizieren, was nicht effizient ist, da eine Neuindizierung historischer Datensätze erforderlich ist.
Wenn Datenspeicher also beliebige Abfragen auf Daten unterstützen müssen, sind Sprunglisten eine ideale Wahl.
- 1. Bereichsabfragen mit B-Bäumen und B + -Bäumen
- 2. Warum werden STL-Container gegenüber MFC-Containern bevorzugt?
- 3. Warum wird `row.names` gegenüber` rownames` bevorzugt?
- 4. Warum wird tinyALSA gegenüber libasound bevorzugt?
- 5. Wird XAMPP (für Windows) gegenüber WampServer bevorzugt? Wenn ja warum?
- 6. Wird INTERSECT gegenüber Unterabfragen bevorzugt?
- 7. Spark-Effekte: Warum wird der prozedurale Code gegenüber Triggern bevorzugt?
- 8. Sollte glob.glob (...) gegenüber os.listdir (...) oder umgekehrt bevorzugt werden?
- 9. Warum "implementiert Runnable" ist bevorzugt gegenüber "erweitert Thread"?
- 10. SVGKit: Leistung und sollte es gegenüber PNG bevorzugt werden?
- 11. Wird PNG für alle Bilddateien unter iOS gegenüber JPEG bevorzugt?
- 12. Sollten "while loops" gegenüber "for loops" für große, notwendige loops in R bevorzugt werden?
- 13. Warum sollte die Schnittstelle für eine Java-Klasse bevorzugt werden?
- 14. Warum Restful WCF-Dienste für mobile Anwendungen bevorzugt werden?
- 15. Warum wird update() für Spiellogik und nicht für didFinishUpdate bevorzugt?
- 16. Werden leere Initialisierer für die Standardinitialisierung von Integral-Membern bevorzugt?
- 17. Wie wird der HTML-Zeichensatz gegenüber der Browsertextcodierung bevorzugt?
- 18. Wann wird Lucene gegenüber Solr oder ElasticSearch bevorzugt?
- 19. In Presenter Zuerst, warum ist die SubscribeSomeEvent-Methode auf einer Schnittstelle gegenüber einfachen alten Ereignissen bevorzugt?
- 20. Warum bevorzugt Android statische Klassen?
- 21. Warum wird die Verwendung von cin, cout oder% I64d gegenüber% lld in C++ bevorzugt?
- 22. Warum wird die Diktat-Literal-Syntax gegenüber dem Diktat-Konstruktor bevorzugt?
- 23. Warum DCT-Transformation gegenüber anderen Transformationen in Video-/Bildkompression bevorzugt wird
- 24. Warum bevorzugt Java den Doppelkonstruktor?
- 25. Wann sollten TAGs gegenüber BRANCHING und umgekehrt (in CVS) bevorzugt werden?
- 26. Warum wird die Cross-Entropie-Methode gegenüber dem mittleren quadratischen Fehler bevorzugt? In welchen Fällen hält dies nicht stand?
- 27. textView, z. B. kann nicht ausgewählt werden?
- 28. Gegenüber für OpacityMask
- 29. Wann sollte JCR (Content Repository) gegenüber anderen Optionen verwendet werden?
- 30. Welche Datenbanken können mit Java verwendet werden?
Eine gut geschriebene und aufschlussreiche Antwort. Treffe alle Punkte, die ich wissen musste. Vielen Dank! –