mysql - 如何在 MySQL 中有效地找到重复的 blob 行?

标签 mysql optimization join blob

我有一个表格

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

它在 blob 列中有大约 160,000 行和大约 2GB 的数据(每个 blob 平均 14kb)。另一个表在这个表中有外键。

大约有 3000 个 Blob 是相同的。所以我想要的是一个查询,它会给我一个重新映射表,让我可以删除重复项。

天真的方法在 30-40k 行上花费了大约一个小时:

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 建立索引,直接查询需要大约 24 秒的 50k 行:

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 秒。

好吧,问题来了:我会比第二次选择好得多吗?如果是这样,怎么做?

一点推论是:如果我有一个表,其中键列的使用非常频繁,但其余的应该很少使用,我是否最好添加该表的另一个连接以鼓励索引扫描与. 全表扫描?


#mysql@irc.freenode.net 上的 Xgc 指出,添加像大小这样的实用程序表但对 fk 具有唯一约束可能会有很大帮助。一些有趣的触发器和其他一些有趣的东西可能会让保持最新状态变得不错。

最佳答案

您始终可以对数据使用哈希函数(MD5SHA1),然后比较哈希。

问题是您是否可以将哈希值保存在数据库中?

关于mysql - 如何在 MySQL 中有效地找到重复的 blob 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319860/

相关文章:

mysql - 在mysql中使用多个连接时加快查询速度

performance - 为什么 `filterM + mapM_`比 `mapM_ + when`慢得多,且列表很大?

tsql - 你写哪个SQL?

MySql 自动递增停在 255

php - 从 Swift 发送 HTTP post 请求到数据库 mysql

javascript - am4charts 不适用于时间变量,但它适用于 autoid 变量

algorithm - Pascal 中的模幂运算相对较慢

mysql - 如何优化以下查询

php - MySQL join across 3 tables running very slowly

sql - 即使为 0,也返回 count(*)