2009-09-17 5 views
1

примечание: в редакцию: измените название, если есть лучше один :)удалить записи из таблицы, используя другую таблицу?

мой вопрос:

У меня есть две таблицы в моей базе данных

 ----------- 
    | table1 | 
    |----------| 
    | id  | 
    |text  | 
    =========== 


    ----------- 
    | table2 | 
    |----------| 
    | id  | 
    |text  | 
    =========== 

table1 составляет 600000 записей

таблица2 - 5 000 000 записей !! :)

Что является лучшим способом удалить все записи в таблице2, которые являются не в table1

Я главный, кстати -The быстрый способ, потому что я не хочу ждать 4 часа, чтобы завершить процесс

Есть ли у вас что-то лучше, чем следующий код:

<?PHP 
    $sql = "select text from table2"; 
    $result = mysql_query($sql) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
     $text = $row["text"]; 
     $sql2 = "select id from table1 where text = '$text'"; 
     $query2 = mysql_query($sql2) or die(mysql_error()); 
     $result2 = mysql_num_rows($query2); 
     if($result2==0){ 
      $sql3 = "delete from table2 where text = '$text'"; 
      $query3 = mysql_query($sql3) or die(mysql_error()); 
     } 
    } 
?> 

Спасибо

ответ

5

Как насчет того, чтобы RDBM справился с этим?

, например

DELETE FROM table2 WHERE text NOT IN (select distinct text from table1) 

Приветствия

PS: сделать некоторые резервные копии перед тестированием ...

+0

Может ли такое большое количество записей переполнять журнал транзакций? – mjv

+0

зависят, если он совершает транзакцию, но да, если «да», запись транзакции значительно увеличится – RageZ

1

Почему бы не добавить новый столбец table2, который один байт, а затем просто сделать обновление установка байта в true или «Y», если эта строка находится в обеих таблицах.

Затем просто удалите строки, которые не имеют этого одного набора колонок.

Это казалось бы самым простым и быстрым, ИМО.

3

Ваше решение делает что-то вроде 2 запросов на одну строку в таблице table2 - что означает пару миллионов запросов - что будет довольно медленно ^^

Использование MySQL, вы можете быть в состоянии удалить все это только в одном запросе: инструкция DELETE может использоваться для удаления данных из нескольких таблиц.

Прежде всего, необходимо написать инструкцию выбора, которая будет соответствовать данным, которые вы хотите удалить (это лучший способ проверить, чем пытаться удалить, не зная, действительно ли это будет иметь дело с правильными данными); что-то вроде этого:

select table2.* 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

Это должно предоставить вам все данные, которые находятся в таблице2, но не указаны в таблице1.

После того, как вы уверены, что этот запрос получает правильные данные, вы можете преобразовать его в запрос на удаление:

delete table2 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

Это может сделать - конечно, было бы лучше, чтобы первый тест на тест базы данных, а не на вашем производстве!

Иначе может быть что-то с IN и подзапросом; немного как

delete 
from table2 
where text not in (select text from table1) 

Не уверен, что будет быстрее, хотя, учитывая количество данных, которые вы имеете, - до сих пор так или иначе, я бы не стал делать вид PHP петли вы предложили, но будет идти с SQL запрос, который может удалить все сам по себе: избежать всех вызовов с PHP на БД, безусловно, будет быстрее!

1

Попробуйте это:

DELETE table2 Where id NOT IN (SELECT id from table1) 

Примечание: Сделайте резервную копию перед выполнением запроса

0

Создать Таблицу 3, как table2 вставки в Table3 (SELECT table2.id, TABle2.TEXT из table1 присоединиться таблица2 на. ..) падение table2 альтер Таблица3 новое имя table2

Предполагает немного управления (так что только действительный вариант, если вы можете легко упасть/изменять таблицы), но, по крайней мере, часть DML ш плохо превзошел любой другой вариант, говорит.

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