johanpm:
私はちょうど1テーブルとMySQLデータベースを持っている:フィールドは、次のとおりです。blocknr(一意ではない)、btcaddress(一意ではない)、TXID(一意ではない)、VIN、vinvoutnr、netvalue。
インデックスはbtcaddressとTXIDの両方に存在します。
私はすべて「削除可能」のレコードのペアを削除する必要があります。例は赤で示されています。条件は以下のとおりです。
TXIDは(同じTXIDを持つ2つの以上のレコードが可能)と同じでなければなりません
vinvoutnrは同じでなければなりません
VIN異なっていなければならないが(0、他の1でなければならないだけ2値の0と1を有することができるので、1でなければなりません)
36Mレコードのテーブルでは、およそ33Mのレコードが削除されます。
私はこれを使用しました:
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;
それとも私が削除クエリを忘れるとで、すべての非delatablesで新しいテーブルを作成し、元をドロップしようとしていますか?
データベースは、この削除クエリのためにオフラインにすることができます。
ゴードン・リノフ:
あなたの質問に基づいて、テーブル内のほとんどの行を削除しています。それは本当に高価です。より良いアプローチは、テーブルと再移入それを空にすることです:
create table temp_registration as
<query for the rows to keep here>;
truncate table registration;
insert into registration
select *
from temp_registration;
あなたのロジックは従うことが少し難しいですが、私は維持するために行のロジックがあると思います:
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)
。