项目里需要一个搜索相似图片的功能,百度了一些dhash的算法,生成了16个长度的hash值,在mysql里这样查询:
SELECT pk, hash,
BIT_COUNT( CONV(hash, 16, 10) ^ CONV('4c8e3366c275650f', 16, 10) ) as hamming_distance
FROM image_hashes HAVING hamming_distance < 4 ORDER BY hamming_distance ASC;
经测试,15W条数据,搜索需要很长时间。第二次速度会快些,有啥办法可以优化?
謝邀。
抱歉地說,這個我也沒做過,只是之前聽過漢明距離。 15w數據,不是很多,但是用了
mysql
的函數,沒辦法創建索引。 。 。大概搜了一下,有相同的問題。
可以參考mysql 圖片漢明距離計算, 近40w的異或計算, 如何破
Hamming distance on binary strings in SQL
你可以試試mysql的內存表 MySQL內存表的特性與使用介紹
不好意思,沒有「漢明距離」的相關經驗。
如果只是15W資料的話,可以把資料載入到記憶體裡快取起來,然後在程式裡運算,畢竟SQL並不擅長做這種事。
光從你的SQL來說,的確沒有太大的最佳化空間,能想到的就只有以下幾點:
hash
列用char
代替varchar
捨棄
ORDER BY hamming_distance ASC
,改為由程式排序建議把DDL語句和EXPLAIN結果也發上來一併分析,不過最大的性能卡口應該是
BIT_COUNT(CONV(hash, 16, 10) ^ CONV('4c8e3366c275650f', 16, 10)) as hamming_distance
,其實相當於全表掃描了。