MySQL Join передовой опыт работы с большими данными - PullRequest
1 голос
/ 06 января 2012

table1_shard1 (1 000 000 строк на шард х 120 шардов)

 id_user   hash

таблица2 (100 000 строк)

 value    hash

Желаемый вывод:

 id_user  hash    value

Я пытаюсь найти самый быстрый способ связать id_user со значением из таблиц выше.

Мой текущий запрос выполнялся в течение 30 часов безрезультатно.

SELECT 
    table1_shard1.id_user, table1_shard1.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard1.hash=table2.hash 
GROUP BY id_user
UNION
SELECT 
    table1_shard2.id_user, table1_shard2.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard2.hash=table2.hash 
GROUP BY id_user
UNION 
( ... )
UNION 
SELECT 
    table1_shard120.id_user, table1_shard120.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard120.hash=table2.hash 
GROUP BY id_user

1 Ответ

0 голосов
/ 06 января 2012

Во-первых, есть ли у вас индексы в полях 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
;

Не уверен в выигрыше в производительности, но он будет, по крайней мере, более удобен для обслуживания.

...