MySQLで重複BLOB行を効果的に見つけるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/319860

  •  11-07-2019
  •  | 
  •  

質問

次の形式のテーブルがあります

CREATE TABLE data
{
   pk INT PRIMARY KEY AUTO_INCREMENT,
   dt BLOB
};

ブロブ列には約160,000行と約2GBのデータがあります(ブロブあたり平均14kb)。別のテーブルには、このテーブルへの外部キーがあります。

ブロブの3000個のようなものは同一です。だから私が欲しいのは、重複を削除できるようにするリマップテーブルを提供するクエリです。

単純なアプローチでは、30〜40k行で約1時間かかりました。

SELECT a.pk, MIN(b.pk) 
    FROM data AS a 
    JOIN data AS b
  ON a.dt=b.dt
  WHERE b.pk < a.pk
  GROUP BY a.pk;

他の理由で、blobのサイズを持つテーブルがあります:

CREATE TABLE sizes
(
   fk INT,  // note: non-unique
   sz INT
   // other cols
);

fkとszの両方のインデックスを構築することにより、そこからの直接クエリは5万行で約24秒かかります:

SELECT da.pk,MIN(db.pk) 
  FROM data AS da
  JOIN data AS db
  JOIN sizes AS sa
  JOIN sizes AS sb
  ON
        sa.size=sb.size
    AND da.pk=sa.fk
    AND db.pk=sb.fk
  WHERE
        sb.fk<sa.fk
    AND da.dt=db.dt 
  GROUP BY da.pk;

ただし、da(データテーブル)で全テーブルスキャンを実行しています。ヒット率はかなり低くなければならないので、インデックススキャンの方が良いと思います。それを念頭に置いて、データの3番目のコピーを5番目の結合として追加し、それを取得し、約3秒を失いました。

[OK]の質問: 2番目の選択よりもはるかに良くなるでしょうか?その場合、どのように?

ちょっとした結果は、キー列が非常に頻繁に使用されるが、残りはほとんど使用されないテーブルがある場合、そのテーブルの別の結合を追加して、インデックススキャンと。全表スキャン?


#mysql@irc.freenode.netの

Xgcは、サイズなどのユーティリティテーブルを追加することで fk に一意の制約がある場合、非常に役立つ可能性があることを指摘しています。トリガーや、最新の状態を維持するのが悪くないかもしれません。

役に立ちましたか?

解決

ハッシュ関数( MD5 または SHA1 )を使用してデータを取得し、ハッシュを比較します。

質問は、データベースにハッシュを保存できるかどうかです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top