mysql - 如何在數(shù)據(jù)庫里優(yōu)化 漢明距離 查詢?
問題描述
項目里需要一個搜索相似圖片的功能,百度了一些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;
經(jīng)測試,15W條數(shù)據(jù),搜索需要很長時間。第二次速度會快些,有啥辦法可以優(yōu)化?
問題解答
回答1:謝邀。
抱歉地說,這個我也沒有做過,只是之前聽說過漢明距離。15w數(shù)據(jù),不是很多,但是用了mysql的函數(shù),沒辦法創(chuàng)建索引。。。
大概搜了一下,有相同的問題。可以參考mysql 圖片漢明距離計算, 近40w的異或計算, 如何破
Hamming distance on binary strings in SQL
你可以試試mysql的內(nèi)存表 MySQL內(nèi)存表的特性與使用介紹
回答2:不好意思,沒有“漢明距離”的相關(guān)經(jīng)驗。
如果只是15W數(shù)據(jù)的話,可以把數(shù)據(jù)加載到內(nèi)存里緩存起來,然后在程序里運算,畢竟SQL并不擅長做這種事情。
僅從你的SQL來說,的確沒有太大的優(yōu)化空間,能想到的就只有以下幾點:
hash列用char代替varchar
舍棄ORDER BY hamming_distance ASC,改為由程序排序
建議把DDL語句和EXPLAIN結(jié)果也發(fā)上來一并分析,不過最大的性能卡口應該是BIT_COUNT(CONV(hash, 16, 10) ^ CONV(’4c8e3366c275650f’, 16, 10)) as hamming_distance,其實相當于全表掃描了。
相關(guān)文章:
1. java - mongodb分片集群下,count和聚合統(tǒng)計問題2. javascript - vue 移動端的input 數(shù)字輸入優(yōu)化3. java - 自己制作一個視頻播放器,遇到問題,用的是內(nèi)置surfaceview類,具體看代碼!4. javascript - 有什么兼容性比較好的辦法來判斷瀏覽器窗口的類型?5. 服務器端 - 采用nginx做web服務器,C++開發(fā)應用程序 出現(xiàn)拒絕連接請求?6. 為什么我ping不通我的docker容器呢???7. python - pandas按照列A和列B分組,將列C求平均數(shù),怎樣才能生成一個列A,B,C的dataframe8. 關(guān)于docker下的nginx壓力測試9. javascript - npm start 運行’webpack-dev-server’報錯 Cannot find module ’webpack’10. java 隨機延遲執(zhí)行
