Quand les index de hachage deviennent-ils raisonnables?


4

MySQL ne supporte pas nativement les index de hachage. Donc, faire une pseudo colonne de hachage et créer un index sur une colonne de hachage nécessite une réflexion.

Et il semble être largement compris que si le champ de texte est long, les hachages valent le surcoût dont ils ont besoin. Mais combien de temps le texte devrait-il commencer à penser au hash?

Si j'ai l'intention d'utiliser le hachage 128 bits alors combien de caractères seuil serait un minimum suffisant pour une colonne de texte?

Modifier détails énumérés dans mon autre question peut-être utile https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

Quelle est votre exigence? Un index entre en jeu uniquement lorsqu'il y aura des requêtes dans un formulaire que l'optimiseur de requête utilisera. Quelle est la nature des données en question? Quel type de requêtes allez-vous faire qui impliquent ces données? 14 sept.. 112011-09-14 18:18:53

  0

Voici la description du projet http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 sept.. 112011-09-14 18:49:42

3

Son commence à devenir raisonnable quand il commence à enregistrer votre disque.Mais en même temps, cela commence à prendre votre puissance de calcul.

De nos jours, l'espace disque est considéré comme peu coûteux, mais si vous utilisez un disque SSD, ce n'est pas si bon marché que cela.Comme vous avez besoin d'une correspondance exacte, il ne faudra pas trop de temps processeur, ce qui en fait une meilleure option.

Et la réponse exacte à votre question sur la longueur de la colonne de texte permettant de satisfaire l'utilisation de hachages peut varier en fonction de nombreux facteurs, à partir des compétences du DBA à charger sur le système.

Mais si vous économisez plus de 50% de la RAM en utilisant des hachages et que l’économie totale est d’au moins 2 Go, je pense que cela vaut peut-être la peine d’emprunter cette voie, sinon cela risque d’être une répétition inutile.


3

Je ne suis pas sûr de ce que sont vos raisons de vouloir un indice de hachage.

Mais si vous recherchez des colonnes text/varchar d'indexation, vous pouvez utiliser MyISAM/full-text ou vous pouvez utiliser quelque chose d'externe comme Sphinx ou Lucene.

Vous pouvez également créer une colonne supplémentaire avec une version hachée d'une autre et aussi longue que 1000 octets ou moins, puis elle peut être indexée par MySQL.

J'espère avoir répondu à votre question.

  0

Ma raison de regarder dans l'index pseudo-hash est que ma table contient plus de 150 millions dossiers et j'ai la mémoire limitée (8GB) ainsi je veux optimiser mes index et ne veux pas mettre l'index sur la colonne de texte parce qu'il mangera trop de RAM. 14 sept.. 112011-09-14 17:55:51

  0

Vous pouvez (et devez) spécifier le nombre de caractères d'une colonne de texte que vous souhaitez indexer.Comme dans mytextcolumn (1000) - 1000 étant la limite. Je laisserais MySQL gérer la partie mémoire car elle est très bonne de ce côté. Alternativement, utiliser Sphinx pour ces choses serait probablement l'outil le plus approprié pour le travail. 15 sept.. 112011-09-15 06:58:59

  0

Pourquoi devrais-je mettre index sur colonne de texte quand il a une longueur variable au lieu de créer une colonne de hachage et de mettre une contrainte unique sur la colonne de hachage. Le seul problème de mettre index sur une colonne de hachage est de minimiser la collision aussi bas que possible. 15 sept.. 112011-09-15 16:42:11

  0

Vous pouvez créer une autre colonne hachée et l'indexer, ainsi qu'ajouter votre propre code à votre application pour la rechercher de cette façon. Je dirais simplement que c'est un problème qui a déjà été résolu en utilisant d'autres outils et qui a été largement vérifié par d'autres personnes. Si vous voulez voir si votre chemin fonctionne et est moins complexe, alors mes moyens, essayez-le. 16 sept.. 112011-09-16 10:41:14

  0

En fait, ces outils sont pour la recherche de texte intégral comme sphinx. Mais je suis plus intéressé ici de savoir quand il devient possible de prendre 16 octets de hachages. Comme, au lieu de stocker 100 octets de colonne de texte (lors de l'ajout d'index), l'utilisation de 16 octets est digne. Et le plus important, seule la correspondance exacte est requise, pas les balayages. 16 sept.. 112011-09-16 18:45:01


0

Après avoir lu votre description, j'ai pu voir comment un hachage aurait du sens. Cependant, lorsque vous parlez de l'utilisation de la mémoire, la taille d'une colonne d'index ne rend pas impossible la recherche d'un grand ensemble de données. La technologie d'index de base de mysql est un btree. Btrees divisent et conquièrent.

Le conseil spécifique que je peux donner est le suivant: supposons que vous allez utiliser un hachage md5(). Pour une efficacité maximale, vous devez faire du hachage la clé primaire des tables moteur innodb où le hachage est un char (32). Comme innodb a des index groupés, la récupération des données économisera sur les lectures de disque, et il y a aussi un travail réduit qui doit être fait quand vous utilisez un char, comme vous pourrez le faire puisque le résultat du hachage md5() ne change jamais .

  0

Lorsque le but est d'économiser de la RAM, alors utiliser InnoDB serait une sage décision? 15 sept.. 112011-09-15 16:44:51