Normalerweise werden Daten bei Shards so aufgeteilt, dass serverübergreifende JOINS überhaupt vermieden werden können. Denn diese Operation ist schwierig und teuer. Wenn Ihr Beispiel hypothetisch ist, würde ich empfehlen, alle Daten nach user_id-Feld oder user_group_id zu teilen.
Zum Beispiel enthält Shard A alle Tabellen mit Informationen von Benutzern, deren user_id % 3 =0 ist, Shard B - dessen user_id % 3 =1 ist, Shard C - dessen user_id % 3 =2 ist. Die meisten benötigten JOINS befinden sich also in einem Shard. Für einige komplexe serverübergreifende Abfragen verfügen Sie möglicherweise über einen gemeinsamen NO-SQL-Speicher wie Memcached oder Redis, der Kopien der erforderlichen Daten aus allen Shards enthält (natürlich ist es keine vollständige Kopie aller Tabellen). Solche Speicher können problemlos auf beliebig viele Server repliziert werden. So funktionieren Highload-Projekte.