Лучший способ написать SQL оператор удаления, удаление пар записей - PullRequest
1 голос
/ 02 апреля 2020

У меня есть MySQL база данных только с 1 таблицей: Поля: blocknr (не уникальный), btcaddress (не уникальный), txid (не уникальный), vin, vinvoutnr, netvalue.

Индексы существуют как на btcaddress, так и на txid.

Данные в нем выглядят так: enter image description here

Мне нужно удалить все «удаляемые» записи пары. Пример приведен красным. Условия:

  • txid должен быть одинаковым (может быть более 2 записей с одинаковым txid)

  • vinvoutnr должен быть одинаковым

  • vin должен быть другим (может иметь только 2 значения 0 и 1, поэтому 1 должно быть 0, другое должно быть 1)

В таблице из 36 миллионов записей будет удалено около 33 миллионов.

Я использовал это:

delete t1 
from registration t1 
inner join registration t2 
where t1.txid=t2.txid and t1.vinvoutnr=t2.vinvoutnr and t1.vin<>t2.vin;

Это работает, но занимает 5 часов.

Может быть, это будет работать тоже (еще не проверено):

delete t1 
from registration as t1, registration as t2 
where t1.txid=t2.txid and t1.vinvoutnr=t2.vinvoutnr and t1.vin<>t2.vin;

Или я забываю о запросе на удаление и пытаюсь создать новую таблицу со всеми неделатабельными элементами, а затем удалить оригинал?

База данных может быть в автономном режиме для этого запроса на удаление.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Исходя из вашего вопроса, вы удаляете большинство строк в таблице. Это просто очень дорого. Лучшим подходом является очистка таблицы и ее повторное заполнение:

create table temp_registration as
    <query for the rows to keep here>;

truncate table registration;

insert into registration
    select *
    from temp_registration;

Ваш лог c немного сложен, но я думаю, лог c в строках для хранения:

select r.*
from registration r
where not exists (select 1
                  from registration r2
                  where r2.txid = r.txid and
                        r2.vinvoutnr = r.vinvoutnr and
                        r2.vin <> r.vin
                 );

Для лучшей производительности вы хотите индекс на registration(txid, vinvoutnr, vin).

0 голосов
/ 02 апреля 2020

Учитывая, что вы ожидаете удалить большую часть своих данных, похоже, что самый простой подход - создать новую таблицу с правильными данными, а затем отбросить исходную таблицу, как вы предлагаете. В противном случае исправления ADyson в запросе JOIN могут помочь решить проблему производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...