項目裡需要一個搜尋相似圖檔的功能,百度了一些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
,其實相當于全表掃描了。