MySQLで重複BLOB行を効果的に見つけるにはどうすればよいですか?
-
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
に一意の制約がある場合、非常に役立つ可能性があることを指摘しています。トリガーや、最新の状態を維持するのが悪くないかもしれません。
所属していません StackOverflow