MySQLデータベースでpHashされた類似画像の検索を改善しようとしています。今、私はこのようにハミング距離を数える pHash を比較します:
SELECT * FROM images WHERE BIT_COUNT(hash ^ 2028359052535108275) <= 4
選択結果(エンジン MyISAM)
- 20000行; クエリ時間 < 20ms
- 100000行; クエリ時間 ~ 60ms # 150000 行に達するまではこれで問題ありませんでした
- 300000行; クエリ時間 ~ 150ms
したがって、クエリ時間の増加は、テーブルの行数に依存します。
また、SQL のバイナリ文字列に対するスタックオーバーフロー ハミング距離で見つかったソリューションを試し ます
SELECT * FROM images WHERE
BIT_COUNT(h1 ^ 11110011) +
BIT_COUNT(h2 ^ 10110100) +
BIT_COUNT(h3 ^ 11001001) +
BIT_COUNT(h4 ^ 11010001) +
BIT_COUNT(h5 ^ 00100011) +
BIT_COUNT(h6 ^ 00010100) +
BIT_COUNT(h7 ^ 00011111) +
BIT_COUNT(h8 ^ 00001111) <= 4
行 300000 ; クエリ時間 ~ 240ms
データベースエンジンをPostgreSQLに変更しました。この MySQL クエリを PyGreSQL に変換して も成功しません。行 300000 ; クエリ時間 ~ 18 秒
上記のクエリを最適化するソリューションはありますか? 行数に依存しない最適化を意味します。
この問題を解決する方法 (ツール) は限られています。これまでのところ、MySQL が最も単純なソリューションのように見えましたが、専用マシン上の Ruby で動作するすべてのオープン ソース データベース エンジンにコードをデプロイできます。MsSQL https://stackoverflow.com/a/5930944/766217 (テストされていません) の準備ができているソリューションがいくつかあります。誰かが MySQL または PostgreSQL 用に翻訳する方法を知っているかもしれません。
いくつかのコードまたは観察に基づいて回答を投稿してください。stackoverflow.com には、ハミング距離に関する多くの理論的な問題があります。
ありがとう!