Vanligtvis delas data vid skärvor på ett sätt som gör det möjligt att undvika JOINS över servrar alls. Eftersom denna operation är svår och dyr. Om ditt exempel är hypotetiskt skulle jag rekommendera att dela upp all data efter user_id-fält eller user_group_id.
Till exempel kommer shard A att innehålla alla tabeller med information från användare som user_id % 3 =0, shard B - vilket user_id % 3 =1, shard C - vilket user_id % 3 =2. Så de flesta JOINS som behövs kommer att finnas i ett shard. För vissa komplexa gränsöverskridande frågor kan du ha gemensam NO-SQL-lagring som memcached eller Redis som kommer att ha kopior av nödvändig data från alla skärvor (naturligtvis är det inte en fullständig kopia av alla tabeller). Sådana lagringar kan enkelt replikeras på så många servrar som du behöver. Så här fungerar högbelastningsprojekt.