MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

以前、あるプロジェクトでMysql FIND_IN_SET関数を使用したことがありますが、非常に便利だと感じました。しばらくして、上司が来て、これを IN に変更する必要があると言いました。ハハ、変更するしかありませんでした。理由は以下で分析します。

2 つの違いを説明するテスト テーブルを作成します。Q&A エリアのテスト データをコピーするだけです。問題を説明できる限り問題ありません。ハハ、著作権を侵害している場合はご容赦ください。インターネットなので、共有する必要があります。

テストコード:  
テーブル「test」を作成します( 
 `id` int(8) NOT NULL auto_increment, 
 `name` varchar(255) NOT NULL, 
 `list` varchar(255) NOT NULL, 
 主キー (`id`) 
) 
`test` に VALUES (1, 'name', 'daodao,xiaohu,xiaoqin') を挿入します。 
`test` に値 (2、'name2'、'xiaohu、daodao、xiaoqin') を挿入します。 
`test` に値 (3、'name3'、'xiaoqin、daodao、xiaohu') を挿入します。 
test1:sql = `test` から * を選択します。 where 'daodao' IN (`list`); 
結果は null 値になります。 
test2:sql = select * from `test` where FIND_IN_SET('daodao',`list`); 
3 つのデータを取得します。

上記の実験データを例にとると、test1 の結果は空です。なぜでしょうか? MySQL では等価比較であるため、ここでの「list」はテーブル内のフィールド、つまり変数です。その値が name の値とまったく同じでない限り、返される結果は空になります。 test1 を例にとると、「daodao」を「daodao、xiaohu、xiaoqin」に変更すると、最初のレコードと一致します。

Test2 は 3 つのデータを返しますが、これが必要なデータである可能性があります。 MySQL の FIND_IN_SET 関数は、含まれているかどうかを比較するために使用されます。これは、「リスト」フィールドが変数であるか、指定された文字列定数であるかに関係なく正常に機能します。 MySQL のプロトタイプは、FIND_IN_SET(str,strlist) です。 文字列 str が N 個のサブチェーンで構成される文字列リスト strlist 内にある場合、戻り値の範囲は 1 から N になります。

文字列リストは、「,」文字で区切られた部分文字列で構成される文字列です。最初の引数が定数文字列で、2 番目の引数が SET 型の列である場合、FIND_IN_SET() 関数はビット演算を使用するように最適化されます。 str が strlist にない場合、または strlist が空の文字列の場合、戻り値は 0 になります。いずれかのパラメータが NULL の場合、戻り値は NULL になります。最初の引数にカンマ (',') が含まれている場合、この関数は正しく機能しません。 str は、テーブル内のフィールドなどの変数にすることもできます。

もちろん、これがプロジェクトで FIND_IN_SET を IN に置き換える必要がある理由ではありません。どちらもプロジェクトで同じ機能を実現できるからです。ただ、IN の方が FIND_IN_SET よりもパフォーマンスが高いだけです。クエリするフィールドは主キーです。IN を使用すると、インデックスが使用され、テーブル内のデータの一部のみがクエリされます。 FIND_IN_SET はテーブル内のすべてのデータをクエリします。データ量が多いため、パフォーマンスは確実に高くないため、IN に置き換えられます。クエリが部分的か完全か確認したい場合は、説明関数 EXPLAIN を使用します。部分的であれば型は range、完全であれば型は ALL です。const という型もあり、これは定数レベルです、笑。 。 。

ベストプラクティス:

1. クエリする条件が定数の場合は、IN を使用します。変数の場合は、FIND_IN_SET を使用します。インデックスも使用できるようです、笑。

2. IN と FIND_IN_SET の両方が条件を満たす場合、特にクエリ フィールドが主キーであるかインデックスを持っている場合は、上記と同じ理由で IN を使用することをお勧めします。

3. IN を使用しても機能要件を満たせない場合は、FIND_IN_SET のみを使用できます。笑、IN 条件に % 記号を追加すると問題が解決することもあります。IN に % 記号を追加するのは、単に等価性の比較を行うだけではありません。

要約する

以上が、MySQL の FIND_IN_SET() と IN の違いに関するこの記事の内容のすべてです。ご興味がある方は、MySQL データベース テーブルのパーティション分割の注意事項 [推奨]、いくつかの重要な MySQL 変数、SQL と MySQL ステートメントの実行順序の分析などを参照してください。皆様のお役に立てれば幸いです。どなたでも、交流や議論のためにメッセージを残していただけます。不足があれば、編集者が適時に修正し、補足します。

以下もご興味があるかもしれません:
  • MySQLは、where in()順序ソートを実装するためにfind_in_set()関数を使用します。
  • Mysql での find_in_set の使用の紹介
  • MySQL FIND_IN_SET関数の使い方
  • MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

<<:  Linux で利用可能なネットワーク インターフェイスを表示する方法

>>:  Vue 仮想 DOM クイックスタート

推薦する

CSSセレクターでの正規表現の使用

はい、CSS にも正規表現があります (アーメン) CSS で目立つための 2 つの強力なツール: ...

Vue 2.0 の基礎を詳しく解説

目次1. 特徴2. 例3. オプション4. 基本的な文法5. ライフサイクル6. ルーティング管理 ...

子要素の margin-top によって親要素が移動する問題の解決方法

問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...

VUE のコンパイル スコープとスロット スコープのスロットの問題について

スロットとは何ですか?スロット ディレクティブは v-slot であり、現在 slot と slot...

URLに基​​づいてリクエストを転送するnginxの実装の実践経験

序文これは fastdfs を使用してイントラネット外部に展開された分散ファイルシステムであるためで...

Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)

知らせ! ! !この状況は、実際には仮想マシンのインストール中に回避できます。次回仮想マシンをテスト...

MySql のスロークエリ分析とスロークエリログの開き方の詳細説明

最近はMySQLのパフォーマンス最適化についても研究しているので、今日の投稿は勉強ノートとしても使え...

docker を使用して kafka プロジェクトをデプロイする Centos6 方法の分析

この記事では、Docker を使用して Centos6 に Kafka プロジェクトをデプロイする方...

シンプルなプログレスバーを作成するための HTML+CSS

1. HTMLコードコードをコピーコードは次のとおりです。経験値: <span class=...

Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明

目次vモデル.sync微妙な違い機能シナリオを要約します。 vモデル <!--親コンポーネント...

NetEase ブログで使用されているシンプルな Web ページ コード

NetEase Blog でコードを使用する方法: まずブログにログインし、ブログのホームページの左...

CentOS 7 は Hadoop 2.10 の高可用性 (HA) をビルドします

この記事では、CentOS 7 で高可用性 Hadoop 2.10 クラスターを構築する方法を紹介し...

CentOS での mysql5.7 の詳細なインストールと設定のチュートリアル

インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...

VirtualBox を使用して Linux クラスターをシミュレートする方法

1. ホストMacbookにHOSTをセットアップする前回のドキュメントでは仮想マシンの静的 IP ...