Triés Chaîne de Table (SSTable) ou B+ Tree pour un Index de Base de données?
À l'aide de deux bases de données pour illustrer cet exemple: CouchDB et Cassandra.
CouchDB
CouchDB utilise une Arborescence B+ pour l'index du document (à l'aide de un savant modification de travailler dans leur ajouter seulement de l'environnement) - plus précisément que les documents sont modifiés (insert/update/delete) ils sont annexés à l'exécution de fichier de base de données ainsi qu'une Feuille d' -> chemin d'accès du Nœud de l'arborescence B+ de tous les nœuds effectuée par la mise à jour de la révision à droite après le document.
Ces pièces mealed index des révisions sont intégrées tout au long de l'modifications telles que l'index complet est une union de la plus récente de l'indice des modifications ajoutées à la fin du fichier ainsi que d'autres pièces, plus en arrière dans le fichier de données qui sont toujours d'actualité et n'ont pas été modifiés encore.
La recherche de la B+ tree est O(logn).
Cassandra
Cassandra garde les clés d'enregistrement triée, en mémoire, dans les tableaux (pensons à eux sous la forme de tableaux pour cette question) et les écrit comme distinct (tri) triés-chaîne de tables de temps à autre.
Nous pouvons penser à la collection de toutes ces tables comme l ' "indice" (ce que je comprends).
Cassandra est nécessaire pour compact/combiner ces triés-chaîne de tables de temps à autre, la création d'un fichier complet de la représentation de l'index.
Recherche un tableau trié est O(logn).
Question
En supposant un même niveau de complexité entre le maintien partiel B+ tree morceaux dans CouchDB contre partielle triés-chaîne indices de Cassandra, et étant donné que les deux fournissent O(logn) temps de recherche qui pensez-vous serait de faire une meilleure représentation d'une base de données de l'index et pourquoi?
Je suis spécifiquement curieux de savoir si il y a un détail d'implémentation à propos de l'un sur l'autre, ce qui rend particulièrement attrayant ou si ils sont tous les deux de se laver et de vous il suffit de choisir selon la structure de données que vous souhaitez travailler avec/plus de sens pour le développeur.
Merci pour les pensées.
- Pour quiconque s'intéresse à la question, voici plus d'infos sur les performances de B+ tree, LSM et Fractale de l'Arbre: nosql.mypopescu.com/post/3063887666/...
Vous devez vous connecter pour publier un commentaire.
Lorsque l'on compare un Arbre d'index à un SSTable index, vous devez envisager l'écriture de la complexité:
Lors de l'écriture de façon aléatoire à une copie sur écriture BTree, vous devrez payer des lectures aléatoires (pour faire de la copie de la feuille et le chemin d'accès). Ainsi, alors que l'écrit mon être séquentielle sur le disque, pour les ensembles de données de plus de RAM, ces lectures aléatoires deviendra rapidement le col de la bouteille. Pour un SSTable-comme indice, une telle lecture se produit sur l'écriture, il y aura seulement les écritures séquentielles.
Vous devriez également considérer que, dans le pire des cas, chaque mise à jour d'un Arbre pourrait encourir log_b N IOs - qui est, vous pourriez finir par écrire 3 ou 4 blocs pour chaque touche. Si la taille de la clé est beaucoup moins que la taille du bloc, ce qui est extrêmement coûteux. Pour un SSTable-comme indice, chaque écriture IO contiendra autant de frais clés qu'il le peut, de sorte que le IO coût pour chaque clé est plus comme 1/B.
Dans la pratique, ce SSTable-comme des milliers de fois plus rapide (pour les écritures aléatoires) que BTrees.
Lors de l'examen des détails de l'implémentation, nous avons trouvé beaucoup plus facile à mettre en œuvre SSTable-comme index (presque) sans verrouillage, où que le verrouillage des stratégies pour BTrees est devenu très compliqué.
Vous devriez également considérer votre lire les coûts. Il est exact qu'un Arbre est O(log_b N) aléatoire IOs aléatoire du point de lit, mais un SSTable-comme indice est en fait O(#sstables . log_b N). Sans décent de fusion régime, #sstables est proportionnelle à N. Il existe différentes astuces pour contourner cet (à l'aide de Filtres de Bloom, par exemple), mais ce n'est pas aider avec les petits, gamme hasard des requêtes. C'est ce que nous avons trouvé avec Cassandra:
http://www.acunu.com/blogs/richard-low/cassandra-under-heavy-write-load-part-ii/
C'est pourquoi le Château, de la notre (GPL) moteur de stockage, ne se confond un peu différemment, et peut atteindre beaucoup mieux (O(log^2 N)) de la gamme des requêtes de la performance avec un léger compromis de performances en écriture (O(log^2 N /B)). Dans la pratique, nous trouvons qu'il est plus rapide de Cassandra SSTable indice écrit ainsi.
Si vous voulez en savoir plus à ce sujet, j'ai donné une conférence sur la façon dont il fonctionne:
Je pense fractale des arbres, tel qu'utilisé par Tokutek, sont un meilleur indicateur pour une base de données. Ils offrent dans le monde réel 20x à 80x améliorations par rapport à b-arbres.
Il y a d'excellentes explications de comment fractale de l'arbre des indices de travail ici.
LSM-Arbres est meilleur que B-Arbres sur le moteur de stockage structuré.
Il convertit aléatoire-écrire à l'aof, en quelque sorte.
Voici un LSM-Arbre src:
https://github.com/shuttler/lsmtree
Certaines choses qui devraient également être mentionné au sujet de chaque approche:
B-arbres
O(logn)
. Cependant, une base de données unique d'écriture peut mener à de multiples écritures dans le système de stockage. Par exemple, lorsqu'un nœud est plein, il doit être divisé et qui signifie qu'il y aura 2 écrit pour les 2 nouveaux nœuds et 1 autre à écrire pour la mise à jour du nœud parent. Vous pouvez voir comment cela pourrait augmenter si le nœud parent a été aussi plein.SSTables
O(logn)
. Cependant, il faut toujours garder à l'esprit qu'ils sont fait en mémoire, de sorte qu'ils devraient être les ordres de grandeur plus rapide que les logarithmes des opérations dans le disque de B-arbres. Par souci d'exhaustivité, il convient de mentionner que les écritures sont également écrites dans un write-ahead log pour la récupération de l'incident. Mais, étant donné que ce sont tous des écritures séquentielles, ils sont censés être beaucoup plus efficace que les écritures aléatoires de B-arbres.Comme il devient évident, une comparaison entre ces 2 approches est beaucoup plus compliqué. Dans un extrêmement simplifiée tentative de fournir un béton de comparaison, je pense qu'on peut dire que:
Références
[1] Une Comparaison des Performances de LevelDB et MySQL
[2] Données de la conception d'Applications gourmandes