我试图改进在 MySQL 数据库中搜索相似图像 pHashed。现在我像这样比较 pHash 计数汉明距离:
SELECT * FROM images WHERE BIT_COUNT(hash ^ 2028359052535108275) <= 4
选择结果(引擎 MyISAM)
- 20000 行;查询时间 < 20ms
- 100000 行;query time ~ 60ms # 这很好,直到达到 150000 行
- 300000 行;查询时间 ~ 150ms
因此查询时间增加取决于表中的行数。
我还尝试了 在 SQL 中二进制字符串的 stackoverflow 汉明距离上找到的解决方案
SELECT * FROM images WHERE
BIT_COUNT(h1 ^ 11110011) +
BIT_COUNT(h2 ^ 10110100) +
BIT_COUNT(h3 ^ 11001001) +
BIT_COUNT(h4 ^ 11010001) +
BIT_COUNT(h5 ^ 00100011) +
BIT_COUNT(h6 ^ 00010100) +
BIT_COUNT(h7 ^ 00011111) +
BIT_COUNT(h8 ^ 00001111) <= 4
行 300000 ; 查询时间 ~ 240ms
我将数据库引擎更改为 PostgreSQL。将此 MySQL 查询转换为 PyGreSQL 没有成功。行 300000 ; 查询时间~18s
有没有优化上述查询的解决方案? 我的意思是优化不取决于行数。
我有有限的方法(工具)来解决这个问题。到目前为止,MySQL 似乎是最简单的解决方案,但我可以在每个可以在专用机器上与 Ruby 一起使用的开源数据库引擎上部署代码。MsSQL https://stackoverflow.com/a/5930944/766217有一些现成的解决方案(未测试)。也许有人知道如何为 MySQL 或 PostgreSQL 翻译它。
请根据一些代码或观察发布答案。我们在 stackoverflow.com 上有很多关于汉明距离的理论问题
谢谢!