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條數據,搜索需要很長時間。第二次速度會快些,有啥辦法可以優化?
問題解答
回答1:謝邀。
抱歉地說,這個我也沒有做過,只是之前聽說過漢明距離。15w數據,不是很多,但是用了mysql的函數,沒辦法創建索引。。。
大概搜了一下,有相同的問題。可以參考mysql 圖片漢明距離計算, 近40w的異或計算, 如何破
Hamming distance on binary strings in SQL
你可以試試mysql的內存表 MySQL內存表的特性與使用介紹
回答2:不好意思,沒有“漢明距離”的相關經驗。
如果只是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,其實相當于全表掃描了。
相關文章:
1. vue ajax請求回來的數據沒有渲染到頁面2. javascript - node.js中stat() access() open() readFile()都能判斷文件是否存在?3. 一個mysql聯表查詢的問題4. html的qq快捷登錄怎么搞?求個源碼5. mysql - select查詢多個紀錄的條件怎么寫6. python中def定義的函數加括號和不加括號的區別?7. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處8. mysql - 求SQL語句:查詢某個值介于兩個字段值之間的記錄。9. mysql 能不能創建一個 有列級函數 的聯合視圖?10. 編程小白 問關于python當中類的方法的參數問題
