B-Tree vs tabella hash


103

In MySQL, un tipo di indice è un b-tree e l'accesso a un elemento in un b-tree è in tempo ammortizzato logaritmico O(log(n)).

D'altra parte, l'accesso a un elemento in una tabella hash è in O(1).

Perché non viene utilizzata una tabella hash al posto di un b-tree per accedere ai dati all'interno di un database?


9
Le tabelle hash per non supportare le query di intervallo e non possono crescere o ridursi senza problemi durante il funzionamento.
hmakholm ha lasciato Monica il

3
@HenningMakholm Perché non l'hash per le colonne che non richiedono query di intervallo?
Pacerier

Risposte:


116

Puoi accedere agli elementi solo tramite la loro chiave primaria in una tabella hash. Questo è più veloce che con un algoritmo ad albero ( O(1)invece dilog(n) ), ma non puoi selezionare intervalli ( tutto ciò che si trova tra xey ). Gli algoritmi ad albero lo supportano Log(n)mentre gli indici hash possono provocare una scansione completa della tabella O(n). Anche il sovraccarico costante degli indici hash è solitamente maggiore ( che non è un fattore nella notazione theta, ma esiste ancora ). Anche gli algoritmi ad albero sono generalmente più facili da mantenere, crescere con i dati, scalare, ecc.

Gli indici hash funzionano con dimensioni hash predefinite, quindi si finisce con alcuni "bucket" in cui sono archiviati gli oggetti. Questi oggetti vengono ripetuti in loop per trovare davvero quello giusto all'interno di questa partizione.

Quindi, se si dispone di dimensioni ridotte, si ha molto sovraccarico per elementi piccoli, dimensioni grandi comportano un'ulteriore scansione.

Gli algoritmi delle tabelle hash di oggi di solito vengono ridimensionati, ma il ridimensionamento può essere inefficiente.

Esistono infatti algoritmi di hashing scalabili. Non chiedermi come funziona, è un mistero anche per me. AFAIK si sono evoluti dalla replica scalabile in cui il re-hashing non è facile.

Si chiama RUSH - R eplication U nder S calable H ashing, e quegli algoritmi sono quindi chiamati algoritmi RUSH.

Tuttavia, potrebbe esserci un punto in cui il tuo indice supera una dimensione tollerabile rispetto alle dimensioni hash e l'intero indice deve essere ricostruito. Di solito questo non è un problema, ma per database enormi, enormi, questo può richiedere giorni.

Il compromesso per gli algoritmi ad albero è piccolo e sono adatti per quasi tutti i casi d'uso e quindi sono predefiniti.

Tuttavia, se hai un caso d'uso molto preciso e sai esattamente cosa e solo cosa sarà necessario, puoi sfruttare gli indici di hashing.


Puoi spiegare di più sulla ricostruzione dell'indice? Significa che per x giorni durante la ricostruzione dell'indice, la tabella è totalmente non disponibile per l'uso durante quel periodo?
Pacerier

ciò dipende dal sistema di database in uso. la domanda copriva solo gli aspetti teorici. Non conosco i dettagli di implementazione dei sistemi di database comuni. ma di solito questo non dovrebbe essere il caso perché il secondo indice può essere costruito mentre il primo è ancora in uso
The Surrican

"Puoi accedere agli elementi solo in base alla loro chiave primaria" - intendi con il valore della colonna che ha l'indice giusto, che si tratti di una chiave primaria o di un altro tipo di indice?
Mark Fisher

90

In realtà, sembra che MySQL utilizzi entrambi i tipi di indici o una tabella hash o un b-tree secondo il seguente link .

La differenza tra l'utilizzo di un albero b e di una tabella hash è che la prima consente di utilizzare confronti di colonne in espressioni che utilizzano gli operatori =,>,> =, <, <= o BETWEEN, mentre la seconda viene utilizzata solo per confronti di uguaglianza che utilizzano gli operatori = o <=>.


9
È ingiusto. La risposta migliore ha il punteggio più basso.
Андрей Беньковский

6
Questo e 'esattamente quello che stavo cercando. Mi importava di come influenza le mie domande piuttosto che un'analisi tecnica.
Ben Dehghan il

Sì! Questa risposta mi ha aiutato di più.
Ron Ross

grazie mille, è passato molto tempo ma anche questa risposta mi ha aiutato molto.
Reham Fahmy

14

La complessità temporale delle tabelle hash è costante solo per tabelle hash di dimensioni sufficienti (devono essere presenti intervalli sufficienti per contenere i dati). La dimensione di una tabella di database non è nota in anticipo, quindi la tabella deve essere modificata di tanto in tanto per ottenere prestazioni ottimali da una tabella hash. Anche il rimaneggiamento è costoso.


2
È possibile eseguire il reshashing mentre db è online? O dobbiamo bloccare il tavolo per rimescolare tutto?
Pacerier

1
Pacerier, MySQL non supporta gli indici hash. È teoricamente possibile eseguire nuovamente ilhash dell'indice mentre il database è ancora online (continuare a utilizzare il vecchio indice, creare un nuovo indice, passare a quello nuovo quando è finito) ma non so cosa farebbe MySQL se lo implementassero indizi di hash.
Emil Vikström

3
MySQL supporta gli indici hash, giusto? : dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier

Sembra che tu abbia ragione. Quello era nuovo per me! Devo cercare di stare al passo con lo sviluppo :-) Allora sei molto meglio nel rispondere alla tua domanda di me, ma come ho detto: è teoricamente possibile.
Emil Vikström

A proposito, perché dici che "un btree può essere facilmente trasferito su disco ma un hashtable no"? Non è possibile memorizzare una tabella hash nel disco poiché sarebbe sufficiente una semplice ricerca delle chiavi?
Pacerier

6

Penso che gli hashmap non si scalino altrettanto bene e possono essere costosi quando l'intera mappa deve essere modificata.


0

Pick DB / OS era basato sull'hashing e funzionava bene. Con più memoria in questi giorni per supportare tabelle hash sparse efficienti e hashing ridondante per supportare query di intervallo modesto, direi che l'hashing potrebbe ancora avere il suo posto (alcuni preferirebbero avere altre forme di corrispondenza della somiglianza non di intervallo, come i caratteri jolly e le espressioni regolari ). Si consiglia inoltre di copiare per mantenere le catene di collisioni contigue quando le gerarchie di memoria presentano grandi differenze di velocità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.