Di solito i dati si dividono in frammenti in un modo che consente di evitare del tutto JOIN tra server. Perché questa operazione è difficile e costosa. Se il tuo esempio è ipotetico, consiglierei di dividere tutti i dati per il campo user_id o user_group_id.
Ad esempio, lo shard A conterrà tutte le tabelle con le informazioni degli utenti quali user_id % 3 =0, shard B - quale user_id % 3 =1, shard C - quale user_id % 3 =2. Quindi la maggior parte dei JOINS necessari sarà all'interno di uno shard. Per alcune complesse query cross-server potresti avere una memoria NO-SQL comune come memcached o Redis che avrà copie dei dati necessari da tutti i frammenti (ovviamente non è una copia completa di tutte le tabelle). Tali archivi possono essere facilmente replicati su tutti i server necessari. Ecco come funzionano i progetti highload.