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 クイックスタート

推薦する

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。...

MySQL オンラインリカバリ UNDO テーブルスペース 実戦記録

1 MySQL5.6 1.1 関連パラメータMySQL 5.6 では、innodb_undo_dir...

Linux での GDB 入門チュートリアル

序文gdb は Linux で非常に便利なデバッグ ツールです。コマンドライン モードのデバッグ ツ...

セマンティック HTML 構造の利点は何ですか?

1つ: 1.セマンティック タグは単なる HTML であり、CSS にはセマンティクスはありません...

MySQL 5.7.24 のインストールと設定のグラフィックチュートリアル

この記事では、MySQL 5.7.24のインストールと設定のチュートリアルを参考までに紹介します。具...

Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...

vue+springbootでログイン機能を実現

この記事の例では、ログイン機能を実現するためのvue+springbootの具体的なコードを参考まで...

進捗バーのネイティブ JavaScript 実装

進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...

Alibaba Cloud に Docker をインストールする際の問題と解決策

質問Alibaba Cloud イメージを使用して Docker をインストールすると、次の図に示す...

SQL ファジー クエリ レポート: ORA-00909: パラメータの数が無効です。解決策

あいまいクエリにOracleデータベースを使用する場合、コンソール エラーは次の図に表示されます。理...

ファイルが存在するかどうかを判断する JavaScript サンプルコード

1. ビジネスシナリオ最近はファイルのアップロードやダウンロードに関する開発をしています。ダウンロー...

Linux でプロセスを効果的に管理するための 8 つのコマンド

序文プロセス管理の役割:サーバーの健全性状態を判定する: プロセスの状態 (メモリ、CPU 占有率な...

Mysql テーブルで利用可能な最小 ID 値を照会する方法

今日、研究室のプロジェクトを見ていたとき、私にとって「難しい」問題に遭遇しました。実は、それは私があ...