天天看點

mysql 漢明距離檢索_如何在資料庫裡優化 漢明距離 查詢?

項目裡需要一個搜尋相似圖檔的功能,百度了一些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

,其實相當于全表掃描了。