Sharding moves the routing decision out of a single database and into a hash function. This diagram is the path a query takes: extract the shard key, hash it, map the hash to a node, and execute there. The design goal is that every query carries its key — because the moment it doesn't, the proxy has to ask every shard and merge the answers, which multiplies cost by the number of shards.
The routing scheme is the permanent decision. Modulo routing is simple and terrible to resize — moving from N to N+1 shards remaps almost everything. Consistent hashing keeps most mappings stable but needs a virtual-node layer to stay balanced. The stages after routing — connection pooling, local execution, merge — are the same in any design. This flow is why the shard key choice is the most consequential decision in a sharded system: it determines which of these stages is a point lookup and which is a fan-out.