44 votes

Table de chaîne triée (SSTable) ou arbre B + 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 d' un astucieux 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 -> 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 l' arborescence B+ 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.

À la recherche d'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 le 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.

55voto

tom.wilkie Points 1591

Lors de la comparaison d'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 que vous lisez 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:

9voto

Will Points 30630

Je pense que les arbres fractals, utilisés par Tokutek , constituent un meilleur index pour une base de données. Ils offrent des améliorations réelles de 20 à 80 fois par rapport aux arbres b.

Il y a d' excellentes explications sur la façon dont les indices d'arbre fractal fonctionnent ici .

1voto

BohuTANG Points 21

LSM-Trees est meilleur que B-Trees sur un moteur de stockage structuré. Il convertit l’écriture aléatoire en aof d’une certaine manière. Voici un src LSM-Tree: https://github.com/shuttler/lsmtree

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X