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 では、要素タグは、要素の表示モードの違いに応じて、インラインレベル要素とブロックレベル要素の...

キーボード上の各種特殊記号の英語読み方(知識の普及)

キーボード文字英語`バッククォート〜チルダ!叫ぶ@で#ナンバーサイン$ドル%パーセント^キャレット&...

Linux で Hadoop クラスターをインストールするための詳細な手順

目次1. usrディレクトリにHadoopディレクトリを作成し、インストールパッケージをそのディレク...

CSS3 で @media を使用して Web ページの適応を実現するためのサンプル コード

現在、コンピュータモニターの画面解像度はますます高くなる傾向にありますが、携帯電話などのモバイルデバ...

vue3+electron12+dll 開発のためのクライアント構成の詳細な説明

目次リポジトリソースを変更する起動するvue-devtoolsを置き換える予防ボーダーレスウィンドウ...

MySQLデータベース最適化技術の簡単な紹介

成熟したデータベース アーキテクチャは、最初から高可用性、高スケーラビリティなどの機能を備えて設計さ...

HTMLノードの追加と削除の簡単な例

<br />HTMLノードの追加と削除の簡単な例<input type="...

丸い角や鋭い角を表現するために、絵の代わりに文字を使用する研究

Google Gmail ページから撮った次のスクリーンショットをご覧ください (同じ場所からスクリ...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

jsオブジェクトの読み取り速度の詳細な例

1. リテラルとローカル変数へのアクセスは最も高速ですが、配列要素とオブジェクト メンバーへのアクセ...

CSS3 列を使用したカード ウォーターフォール レイアウトを実装するためのサンプル コード

この記事では、カード ウォーターフォール レイアウトを実現するための CSS3 列のサンプル コード...

Linuxグループの基礎知識ポイントまとめ

1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...

Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

目次問題の説明Vueの動的コンポーネントとはアプリケーションシナリオの説明実装手順ステップ 1 (新...

Dockerネットワーク作成に--subnetを追加した後の問題を解決する

Docker ネットワークの作成に –subnet を追加した後、docker network ls...

SMS送信のカウントダウンを実装するJavaScript

この記事では、SMS送信のカウントダウンを実装するためのJavaScriptの具体的なコードを参考ま...