mysqlのファジークエリのように置き換える最良の方法は? ? ? ? ?教えてください! ! ! !

WBOY
リリース: 2016-06-23 14:16:48
オリジナル
1817 人が閲覧しました

MySQL ファジー クエリ ベスト インデックス

私は最近、あるプロジェクトに取り組みました。製品分類の属性には 30 を超える属性値があり、編集すると、選択した属性の int 値が文字列に統合され、データベースに書き込まれます。 。このように、フロントで問い合わせる際に属性を選択し、データベースの属性文字列と照合します。 。 。
これは MySQL でよくある厄介な問題のはずですが、クエリがあまりなかったため、最近このプロジェクトの検索量が非常に多くなりました。 。そこで私は神にアドバイスを求めるためにやって来ました。 。
インターネット上のほとんどの人は、全文一致インデックス作成方法を使用した方が like クエリよりも確実に速いと言っていますが、これが最も効率的でしょうか? ? ?

ディスカッション(解決策)への返信

全文検索は like クエリよりも確実に高速です
ただし、mysql の全文検索は中国語をサポートしておらず、サードパーティ ソフトウェアのインストールが必要です

次の int 値を統合します。選択した属性を文字列に変換するにはどうすればよいでしょうか?

フロントエンドから渡された属性オプションは文字列に統合され、データ テーブル内の属性文字列と照合されます。 。今考えてみても順番を間違えるとマッチングに失敗します。 。 。
全文検索は like クエリよりも確実に高速です
ただし、mysql の全文検索は中国語をサポートしておらず、サードパーティ ソフトウェアのインストールが必要です

選択した属性の int 値を文字列に統合するので、どうすればよいでしょうかあなたはそれを問い合わせますか?

属性フィルタリングに関する他の良いアイデアはありますか? ? ?

2 つの関数 find_in_set と substring_index を組み合わせるだけです
もちろん、属性文字列は次のように編成されます:
属性 1、値 1、属性 2、値 2、属性 3、値 3、属性 4、値 4、属性 5、 value 5,....

これら 2 つの関数に加えて、他にも 5 ~ 8 つのクエリ条件があります。 。何万ものレコードがある場合、CPU はそれに耐えることができますか? ? ?
2 つの関数 find_in_set と substring_index を組み合わせるだけです
もちろん、属性文字列は次のように編成されます:
属性 1、値 1、属性 2、値 2、属性 3、値 3、属性 4、値 4、属性 5、値5 、...

効率についてはあまり話さないようにしましょう。 効率はどこで得られますか?

まず、関数

select substring_index(substring_index(n,',',find_in_set('属性2', n)),',',-1)from (select '属性1,值1,属性2,值2,属性3,值3,属性4,值4,属性5,值5' as n) t
ログイン後にコピー
の使用法を体験するために、mysql マネージャーで次のクエリを実行します

テーブル分割....

実際、この要件では、値をビット単位の AND メソッドの代わりに書き込むことを検討する必要があります。文字列の合成 Write
1: 属性 1
2: 属性 2
4: 属性 3
8: 属性 4
...
属性 1+属性 3=>1+4=5、データベースは整数値 5 を書き込みます

(5&1)== 1 --> 属性 1 が含まれます
データベースの操作も同様です: where (options & 1)=1

実際、この種の要件の場合は、ビット単位の AND メソッドで値を記述することを検討する必要があります。文字列を合成して
1: 属性 1
2: 属性 2
4: 属性 3
8: 属性 4
...
属性 1+属性 3=>1+4=5 を記述する代わりに、データベースはタイプ全体を書き込みます。 value 5

(5&1)== 1 --> 属性 1 が含まれます
データベースの操作も同様です: where (options & 1)=1
もう少し詳しく説明してもらえますか?

より詳しい例を教えていただけますか? ?順列と組み合わせに似たアルゴリズム? ?

実際、この種の要件の場合は、文字列の書き込みを合成する代わりに、ビット単位の AND メソッドで値を書き込むことを検討する必要があります。
1: 属性 1
2: 属性 2
4: 属性 3
8: 属性 4
..
属性 1 + 属性 3 =>1+4=5、データベースは整数値 5 を書き込みます

(5&1)== 1 --> 属性 1 を含みます
データベースの操作は同様です: where (options & 1) )= 1

この例は十分に詳しく説明されています。整数間のビット単位の AND 演算について詳しく学んでください。実際には、これは 2 進数の AND 演算でもあります。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート