J'ai un cas d'utilisation pour tesson à base de gamme dans une base MySQL i.e.meilleure façon de choisir le meilleur suivant id max pour un tesson
---------------------
shard | upperbound
---------------------
1 | 500
2 | 1000
3 | 1500
Signification Shard1
a 1- 500
utilisateurs et shard2
a 501-1000
utilisateurs et ainsi de suite. Alors que ce dernier point sur la base d'utilisateurs se développer, continuera à ajouter de nouveaux fragments.
Le tableau utilisateur ressemble ci-dessous:
-----------------------------
id | name | email | contact
-----------------------------
1 |Test |[email protected]|xxxxx
501 |Test1 |[email protected]|xxxxx
101 |Test2 |[email protected]|xxxxx
1001 |Test3 |[email protected]|xxxxx
Ainsi, l'utilisateur avec le nom Test
réside dans shard1
, l'utilisateur avec le nom test2
réside dans shard2
et l'utilisateur avec le nom Test3
réside dans shard3
et ainsi de suite.
Lorsqu'un nouvel enregistrement utilisateur se produit, sur la base open shards
permet de dire (Shard4 et Shard5 est ouvert pour l'enregistrement), il fait d'abord un select on the user table with range
pour obtenir le next max possible Id
et l'incrément de 1 et stocke. Le problème avec cette approche est quand deux personnes différentes essayent de s'inscrire et du code select
renvoie le même id pour les deux différentes personnes/fil car l'enregistrement d'utilisateur ne peut pas être dans la même transaction. Y at-il un autre meilleur moyen de choisir le next id for a shard using range
?
En option, vous pouvez utiliser SP (procédure stockée) pour cela sans sélectionner et insérer. Sp va le faire et retourner l'identifiant. –
@MaheshMadushanka: Comment SP va-t-il savoir de quel shard il ira, je veux dire quelle gamme pour s'occuper, aussi comment il va gérer le tesson plein? Je suis pauvre en mysql, toute référence d'échantillon aide vraiment –
La probabilité de votre problème est considérablement réduite, si vous pouvez vous assurer qu'il n'y a virtuellement * pas de temps * entre tirer l'identifiant max et stocker le nouveau incrémenté. Vous pouvez vous en assurer en utilisant un SP ou en envoyant les statemets 'select' et' insert' * directement * les uns après les autres. – cars10m