La meilleure approche pour la fragmentation des tables MySQL de ne pas le faire, sauf s'il est totalement inévitable de le faire.
Lorsque vous écrivez une application, habituellement, vous voulez le faire d'une manière qui maximise la vitesse, développeur de vitesse. Vous optimisez le temps de latence (temps jusqu'à ce que la réponse est prête) ou le débit (nombre de réponses par unité de temps) uniquement lorsque c'est nécessaire.
Vous partition et ensuite affecter les partitions pour différents hôtes (= fragment) uniquement lorsque la somme de toutes ces partitions ne plus tenir sur une seule instance du serveur de base - la raison d'être soit écrit ou lit.
L'écriture de cas est soit a) la fréquence d'écriture est cette surcharge des serveurs de disques de façon permanente ou b) il y a trop écrit d'aller sur de sorte que la réplication de façon permanente gal dans ce réplication de hiérarchie.
Le lire en cas de fragmentation, c'est quand la taille des données est si grande que l'ensemble de travail de ne plus s'inscrit dans la mémoire et les lectures de données tapent sur le disque au lieu d'être servi à partir de la mémoire, la plupart du temps.
Seulement quand vous avez à tesson-vous de le faire.
Le moment où vous tesson, vous payez pour cela de plusieurs manières:
Une grande partie de votre SQL n'est plus déclaratif.
Normalement, en SQL, vous dites la base de données les données que vous voulez et de le laisser à l'optimiseur de transformer la spécification dans un programme d'accès aux données. C'est une bonne chose, parce qu'il est flexible, et parce que l'écriture de ces données, les programmes d'accès est ennuyeux de travail qui nuit à la vitesse.
Avec un environnement fragmenté, vous êtes probablement à joindre à une table sur Un nœud à l'encontre des données sur le nœud B, ou si vous avez une table plus gros qu'un nœud, sur les nœuds A et B et se joignent à des données sur des données sur le nœud B et C. Vous commencez à écrire logiciel de base de hachage rejoindre résolutions manuellement afin de résoudre ce (ou vous êtes réinventer le cluster MySQL), ce qui signifie que vous retrouvez avec beaucoup de SQL qui n'est plus déclarative, mais exprimant des fonctionnalités SQL dans une voie procédurale (par exemple, vous êtes à l'aide de SELECT dans les boucles).
Vous engager beaucoup de latence du réseau.
Normalement, une requête SQL peut être résolu localement et à l'optimiseur connaît les coûts associés avec le disque local accède et résout la requête d'une manière qui minimise les coûts.
Dans un environnement fragmenté, les requêtes sont résolues par l'exécution de clé-valeur accède à travers un réseau de plusieurs nœuds (espérons-le avec des lots clé d'accès et pas de clé individuelle des recherches par aller-retour) ou en poussant les parties de l' WHERE
clause de partir vers les nœuds où ils peuvent être appliqués (qui est appelé "la condition refoulement"), ou les deux.
Mais même dans le meilleur des cas, cela implique beaucoup plus de réseau allers et retours qu'une situation locale, et c'est plus compliqué. Surtout depuis que l'optimiseur MySQL ne sait rien à propos de la latence du réseau (Ok, MySQL cluster est lentement mieux, mais pour la vanille MySQL à l'extérieur du cluster qui est toujours vraie).
Vous perdez beaucoup de puissance expressive de SQL.
Ok, c'est probablement moins important, mais les contraintes de clés étrangères et d'autres SQL mécanismes de l'intégrité des données sont incapable de se couvrant de multiples fragments.
MySQL n'a pas d'API qui permet de requêtes asynchrones qui est en ordre de marche.
Lorsque des données de même type se trouve sur plusieurs nœuds (par exemple, les données de l'utilisateur sur les nœuds A, B et C), horizontal requêtes doivent souvent être résolu par rapport à l'ensemble de ces nœuds ("Trouver tous les comptes d'utilisateurs qui n'ont pas été enregistré dans les 90 jours ou plus"). L'accès aux données en temps croît linéairement avec le nombre de nœuds, sauf si plusieurs nœuds peuvent être posées en parallèle et les résultats agrégés comme ils viennent dans ("Map-reduce").
La condition sine qua non est une communication asynchrone de l'API, qui n'existe pas pour MySQL dans une bonne forme. L'alternative est beaucoup de bifurquer et de connexions dans le processus fils, qui est en visite dans le monde de sucer sur une passe de saison.
Une fois que vous commencez la fragmentation, la structure de données et de la topologie du réseau deviennent visibles comme des points de performance pour votre application. Afin d'effectuer raisonnablement bien, votre application doit être conscient de ces choses, et qui signifie que vraiment que le niveau d'application de la fragmentation du sens.
La question est plus si vous voulez auto-tesson (détermination de la ligne qui va dans le nœud par hachage des clés primaires par exemple) ou si vous souhaitez diviser le plan fonctionnel dans une manière manuelle ("les tables relatives à La xyz article de l'utilisateur aller à ce maître, tandis que l'abc et def tables liées aller pour que le maître").
Fonctionnelle de fragmentation a l'avantage que, si c'est bien fait, il est invisible à la plupart des développeurs, la plupart du temps, parce que toutes les tables liées à leur utilisateur de l'histoire sera disponible localement. Qui leur permet de profiter encore de SQL déclarative aussi longtemps que possible, et qu'elle implique également moins de latence du réseau, parce que le nombre de croix-réseau de transferts est réduite au minimum.
Fonctionnelle de fragmentation a l'inconvénient de ne pas permettre qu'une seule table pour être plus grand qu'un exemple, et il exige manuel de l'attention d'un designer.
Fonctionnelle de fragmentation a l'avantage qu'il est relativement facile à faire à une base de code existante avec un certain nombre de changements qui n'est pas trop grande. http://Booking.com il l'a fait à plusieurs reprises au cours des dernières années et cela a bien fonctionné pour eux.
Après avoir dit tout cela, à la recherche à votre question, je crois que vous vous poser les mauvaises questions, ou je suis complètement à l'incompréhension de votre énoncé du problème.