天天看點

mysql 漢明距離檢索_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的函數,沒辦法建立索引。。。

大概搜了一下,有相同的問題。

[http://zj86.info/post=133 我們應該考慮哪些因素能影響到查詢優化可以分為:機器硬體、索引、系統參數、查詢技巧等。對于一個查詢優化問題,我們應� ...],

不好意思,沒有“漢明距離”的相關經驗。

如果隻是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,其實相當于全表掃描了。[優化目标減少IO次數IO永遠是資料庫最容易瓶頸的地方,這是由資料庫的職責所決定的,大部分資料庫操作中超過90%的時間都是IO操作所占用的,減少IO次數是SQL優化中需要第一