Quando gli indici hash diventano ragionevoli?


4

MySQL nativamente non supporta gli indici hash.Quindi, fare una pseudo colonna di hash e creare un indice su una colonna di hash richiede qualche riflessione.

E sembra essere ampiamente capito che se il campo di testo è lungo, allora gli hash valgono l'overhead che richiedono.Ma quanto tempo dovrebbe essere il testo per iniziare a pensare all'hash?

Se intendo utilizzare l'hash a 128 bit, quanti soglie di caratteri sarebbero un minimo sufficiente per una colonna di testo?

modificareI dettagli elencati nella mia altra domanda https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram utili https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

Qual è il tuo requisito?Un indice entra in gioco solo quando ci saranno query in un modulo che verranno utilizzate da Query Optimizer.Qual è la natura dei dati in questione?Che tipo di query farai che riguardano questi dati? 14 set. 112011-09-14 18:18:53

  0

Ecco la descrizione del progetto http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 set. 112011-09-14 18:49:42

3

Inizia a diventare ragionevole quando inizia a salvare il disco.Ma allo stesso tempo inizia a prendere il tuo potere computazionale.

Oggigiorno lo spazio su disco è considerato economico, ma se usi SSD, non è così economico.Siccome hai bisogno di una corrispondenza esatta, non ci vorrà troppa CPU, quindi potrebbe essere un'opzione migliore.

E la risposta esatta della tua domanda sulla lunghezza della colonna di testo per soddisfare l'uso degli hash può variare in base a molti fattori che partono dall'abilità di DBA di caricare sul sistema.

Ma se si risparmia più del 50% della RAM utilizzando gli hash e il risparmio totale della RAM è almeno di 2 GB, penso che valga la pena di prendere questa strada altrimenti potrebbe essere una prova non necessaria.


3

Non sono sicuro di quali siano le tue ragioni per desiderare un indice hash.

Ma se stai cercando l'indicizzazione del testo/colonne varchar allora puoi andare con MyISAM/full-text o puoi usare qualcosa di esterno come Sphinx o Lucene.

In alternativa, puoi creare una colonna aggiuntiva con una versione hash di un'altra e fino a 1000 byte o meno, quindi può essere indicizzata da MySQL.

Spero di aver risposto alla tua domanda.

  0

La mia ragione per guardare in pseudo indice di hash è perché la mia tabella contiene oltre 150 milioni di record e ho una memoria limitata (8 GB), quindi voglio ottimizzare i miei indici e non voglio mettere l'indice sulla colonna di testo perché mangerà troppo RAM. 14 set. 112011-09-14 17:55:51

  0

Puoi (e devi) specificare la quantità di caratteri di una colonna di testo che desideri indicizzare.Come in mytextcolumn (1000) - 1000 è il limite.Vorrei lasciare a MySQL gestire la parte della memoria poiché è molto buona da quella parte.In alternativa, usare Sphinx per queste cose sarebbe probabilmente lo strumento più adatto per il lavoro. 15 set. 112011-09-15 06:58:59

  0

Perché dovrei inserire l'indice nella colonna di testo quando ha una lunghezza variabile invece di creare una colonna hash e mettere un vincolo univoco sulla colonna hash.L'unico problema nel mettere l'indice sulla colonna hash sta minimizzando la collisione il più basso possibile. 15 set. 112011-09-15 16:42:11

  0

Puoi creare un'altra colonna hash e indicizzarla, nonché aggiungere il tuo codice alla tua applicazione per cercarla in quel modo.Vorrei solo dire che questo è un problema che è già stato risolto utilizzando altri strumenti e che è stato ampiamente verificato da altre persone.Se ti piacerebbe vedere se la tua strada funziona e è meno complessa, allora tutti i miei mezzi, provaci. 16 set. 112011-09-16 10:41:14

  0

In realtà quegli strumenti sono per la ricerca di testo completo come sfinge.Ma sono più interessato a sapere quando diventerà possibile prendere 16 byte di hash.Come, invece di memorizzare 100 byte di colonna di testo (quando l'indice aggiunto) l'uso di 16 byte è degno.E, soprattutto, è richiesta solo la corrispondenza esatta non scansioni gamma. 16 set. 112011-09-16 18:45:01


0

Dopo aver letto la tua descrizione, ho potuto vedere come un hash avrebbe senso.Tuttavia, quando si parla di memoria, utilizzare la dimensione di una colonna dell'indice non rende impossibile la ricerca di un set di dati di grandi dimensioni.La tecnologia di base dell'indice di mysql è un btree.Gli alberi dividono e conquistano.

Il consiglio specifico che posso dare è questo: supponiamo che userai un hash md5().Per la massima efficienza si dovrebbe rendere l'hash la chiave primaria delle tabelle del motore innodb in cui l'hash è un char (32).Poiché innodb ha indici raggruppati, il recupero dei dati salverà sulle letture del disco, e vi è anche un lavoro ridotto che deve essere fatto quando si usa un char, come si sarà in grado di fare poiché il risultato dell'hash md5() non cambia mai .

  0

Quando lo scopo è salvare la RAM, usare InnoDB sarebbe una decisione saggia? 15 set. 112011-09-15 16:44:51