私はdbで多数の行(MySQL、innoDbエンジン、約2000万行)を扱っており、かなり多くの検索のようにファジーを実行する必要があります。いくつかの理由で、jaro_winkler アルゴリズムを使用することにし、パフォーマンスの問題のために SQL の関数として実装しました。アプリケーションは Python で書かれており、今日遭遇した奇妙な状況があります。
これら 2 つのクエリを比較します (Orm などを介してではなく、mysql シェルから呼び出されます):
SELECT * FROM products WHERE jaro_winkler(code, '78-1747') > 0.7 AND code LIKE '%78%';
と
SELECT * FROM products WHERE code LIKE '%78%' AND jaro_winkler(code, '78-1747') > 0.7;
最初のものは 2 番目のものより少なくとも 10 倍遅いことに気付きました。最初は論理的に思えますが、WHERE の条件の順序を確認したので問題ありません。
だから私の質問 - それは通常の動作ですか?
そして、誰かが(実際の経験から)あいまい検索を実行するための最良のアルゴリズムまたは関数を推奨できますか?damerau-levenshtein メトリックについては知っていますが、現在のソリューションよりも遅くなります。
編集:説明を使用した後:
サンプル データベースを非常に迅速に作成し、両方のクエリを使用しました。
最初のクエリ:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE products ALL NULL NULL NULL NULL 4166 Using where
クエリ時間: ~ 2 秒
2 番目のクエリについて説明します。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE products ALL NULL NULL NULL NULL 4332 Using where
クエリ時間: ~ 0.1 秒