Dans MySQL, un type d'index est un b-tree et l'accès à un élément dans un b-tree est en temps amorti logarithmique O(log(n))
.
Par contre, l'accès à un élément dans une table de hachage se fait en O(1)
.
Pourquoi une table de hachage n'est-elle pas utilisée à la place d'un arbre binaire pour accéder aux données d'une base de données?
Vous ne pouvez accéder aux éléments par leur clé primaire que dans une table de hachage. C'est plus rapide qu'avec un algorithme d'arborescence (O(1)
au lieu de log(n)
), mais vous ne pouvez pas sélectionner de plages. ( tout ce qui se trouve entre x
et y
). Les algorithmes d'arborescence prennent en charge ceci dans Log(n)
alors que les index de hachage peuvent générer un balayage complet de la table O(n)
. De plus, le surcoût constant des index de hachage est généralement plus important (, ce qui n’est pas un facteur dans la notation thêta, mais il existe toujours ). De plus, les algorithmes arborescents sont généralement plus faciles à maintenir, à évoluer avec les données, à l’échelle, etc.
Les index de hachage fonctionnent avec des tailles de hachage prédéfinies. Vous créez donc des "compartiments" dans lesquels les objets sont stockés. Ces objets sont bouclés pour trouver le bon contenu dans cette partition.
Ainsi, si vous avez de petites tailles, vous avez beaucoup de frais généraux pour les petits éléments. Les grandes tailles entraînent une analyse plus poussée.
Les algorithmes de tables de hachage d'aujourd'hui sont généralement évolutifs, mais cette dernière peut s'avérer inefficace.
Il existe en effet des algorithmes de hachage évolutifs. Ne me demandez pas comment cela fonctionne - c'est un mystère pour moi aussi. D'après ce que je sais, ils ont évolué à partir d'une réplication évolutive où le re-hachage n'est pas facile.
Son appelé Rush - R eplication U nder - S calable H ashing, et ces algorithmes sont donc appelés algorithmes de Rush.
Cependant, il peut arriver que votre index dépasse une taille tolérable par rapport à vos tailles de hachage et que votre index entier ait besoin d'être reconstruit. Habituellement, cela ne pose pas de problème, mais cela peut prendre des jours pour des bases de données gigantesques.
Le compromis pour les algorithmes d'arbre est petit et ils conviennent à presque tous les cas d'utilisation et sont donc par défaut.
Toutefois, si vous avez un cas d'utilisation très précis et que vous savez exactement quoi et seulement ce qui sera nécessaire, vous pouvez tirer parti des index de hachage.
En fait, il semble que MySQL utilise les deux types d'index, soit une table de hachage, soit un b-tree, conformément à ce qui suit lien .
La différence entre l'utilisation d'un arbre binaire et d'une table de hachage est que l'ancien vous permet d'utiliser des comparaisons de colonnes dans des expressions utilisant les expressions =,>,> Opérateurs =, <, <= ou BETWEEN, tandis que ce dernier est utilisé uniquement pour les comparaisons d'égalité utilisant les opérateurs = ou <=>.
La complexité temporelle des tables de hachage n'est constante que pour des tables de hachage de taille suffisante (il doit y avoir suffisamment de compartiments pour contenir les données). La taille d'une table de base de données n'étant pas connue à l'avance, vous devez la modifier de temps en temps pour obtenir des performances optimales avec une table de hachage. La rechapage est également chère.
Je pense que les cartes de hachage ne s'adaptent pas aussi bien et peuvent coûter cher lorsque l'ensemble de la carte doit être réorganisé.