2012-07-01 2 views
0

Я просто не слишком уверен в правильном способе этого. У меня в основном есть 2 таблицы. Обе таблицы имеют одинаковую структуру. База данных 1 (текущие данные в среднем 20 тыс. Строк), Database2 (накопление данных, может переходить на 1 мил строк в любой момент времени).mySQL - Сравнение строк таблицы

Я хочу сравнить обе таблицы и дать результат от Database1, который НЕ существует в базе данных2 с конкретным запросом метки времени. То, что у меня было и еще не было выполнено, слишком долго для поиска.

Пробовал:

select distinct player from Database1 
where not exists (select player from Database2 where snap = 1340981695) 

SELECT Database1.player FROM Database1 
INNER JOIN Database2 ON Database1.player NOT IN (Database2.player) AND Database2.snap = 1340981695 
GROUP BY Database1.player 

select distinct Database1.player from Database1 
left join Database2 on Database1.player not in (Database2.player) 
and Database2.snap = 1340981695 

Я до сих пор не могу получить мою голову обернутые вокруг этого. Спасибо за помощь.

+0

Просьба показать структуру и индексы таблицы – Cfreak

+0

Обе таблицы имеют id, player, castle, xaxis, yaxis, snap и id, являющиеся первичным ключом. Никакие данные не всегда одинаковы, всегда меняются (добавляются из Database1 в Database2 (скопированы из Database1 и всегда накапливаются) при создании новых данных и помещаются в Database1. – sgkdnay

+0

На самом деле не будет быстрого способа сделать это. на 'player' и на' snap' должны помочь, так как они присоединяются к 'id' (если они совпадают в таблицах). Возможно, вам лучше сбросить все плоские файлы данных и написать программу для ее анализа, чтобы найти разницу (grep, вероятно, сделает это очень быстро) .После этого вы должны переосмыслить свой дизайн базы данных. MySQL отлично справляется с таблицами строк 1M +. Почему потребность в 2? – Cfreak

ответ

2

Существует три подхода. В приблизительном порядке performance, от лучшего к худшему:

  1. Использование внешнего соединения:

    SELECT Database1.* 
    FROM Database1 
        LEFT JOIN Database2 
         ON Database1.id = Database2.id AND Database2.snap = 1340981695 
    WHERE Database2.id IS NULL 
    
  2. Использование IN:

    SELECT * 
    FROM Database1 
    WHERE id NOT IN (SELECT id FROM Database2 WHERE snap = 1340981695) 
    
  3. Использование EXISTS:

    SELECT * 
    FROM Database1 
    WHERE NOT EXISTS (
         SELECT * 
         FROM Database2 
         WHERE id = Database1.id AND snap = 1340981695 
         ) 
    
+0

Вложенные запросы - это самое плохое. Я не думаю, что в любом случае можно получить какую-либо производительность. Лучше не использовать их. –

+1

Предложите вам прочитать статью блога @ Quassnoi, с которой я связан; второй подход выше имеет аналогичную производительность для внешнего соединения. – eggyal

+0

Эта статья предполагает некоторые специальные случаи, такие как индекс для определенных столбцов. Я предлагаю, что, как правило, это плохая идея побуждать людей писать вложенные запросы, когда вы можете легко обойтись без них. –

Смежные вопросы