Во-первых, есть ли у вас индексы в полях hash
Я думаю, вы должны объединить свои таблицы в одну перед запросом (хотя бы временно)
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_shards
SELECT * FROM table1_shard1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_shards
SELECT * FROM table1_shard2;
# ...
Затем выполнитеосновной запрос
SELECT
table1_shard120.id_user
, table1_shard120.hash
, table2.value
FROM tmp_shards AS shd
LEFT JOIN table2 AS tb2 ON (shd.hash = tb2.hash)
GROUP BY id_user
;
Не уверен в выигрыше в производительности, но он будет, по крайней мере, более удобен для обслуживания.