検索

ホームページ  >  に質問  >  本文

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条数据,搜索需要很长时间。第二次速度会快些,有啥办法可以优化?

PHP中文网PHP中文网2863日前1826

全員に返信(2)返信します

  • 巴扎黑

    巴扎黑2017-04-17 14:56:25

    ご招待いただきありがとうございます。

    申し訳ありませんが、私はこれを行ったことはありませんが、ハミング距離については以前に聞いたことがあります。データは 15,000 個と多くはありませんが、mysql 関数を使用してインデックスを作成する方法はありません。 。 。

    少し検索した結果、同じ問題が見つかりました。

    <オル>
  • ハミング距離の計算、ほぼ 40w の XOR 計算、それを解除する方法については、mysql 画像を参照してください。

  • SQL でのバイナリ文字列のハミング距離

  • MySQL のメモリ テーブルの特徴と使い方を試すことができます。

  • 返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:56:25

    申し訳ありませんが、「ハミング距離」については経験がありません。

    データが 15W しかない場合は、データをメモリにロードしてキャッシュし、プログラム内で計算を実行できます。結局のところ、SQL はこのようなことを行うのは得意ではありません。

    SQL に基づいて考えると、最適化の余地はほとんどありません。

    分析のために DDL ステートメントと EXPLAIN 結果を一緒に送信することをお勧めしますが、最大のパフォーマンス チェックポイントは BIT_COUNT(CONV(hash, 16, 10) ^ CONV('4c8e3366c275650f', 16, 10)) である必要があります。 hamming_ distance のように、実際にはテーブル全体のスキャンと同等です。

    返事
    0
  • キャンセル返事