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

推薦する

MySQL 5.7 のユニオンオール使用法のブラックテクノロジーを 5 分で学ぶ

MySQL 5.6 での union all のパフォーマンスパート 1:MySQL 5.6.25 ...

VirtualBoxにOpenSuseをインストールする方法

仮想マシンはホストマシンにインストールされます。 CPU とメモリはホスト マシンと共有する必要があ...

Dockerコンテナ相互接続の予備的な実践についての簡単な説明

1. Dockerコンテナ間の相互接続Docker は現在、軽量の仮想化ソリューションとなっています...

vue WatchとComputedの使用の概要

目次01. リスナーウォッチ(1)機能(2)特性と方法(3)監視対象(4)リスニングアレイ02. 計...

MySQLのビューの詳細な説明

ビュー: MySQL のビューはテーブルと多くの類似点があります。ビューも複数のフィールドと複数のレ...

ボックスモデルのサイズの詳細な説明は、パディング、マージン、境界の値によって異なります。

ボックス モデルは、要素ボックスの幅と高さ、パディング、境界線、余白のサイズを指定します。境界線の内...

CSS3でカルーセル画像を作成する方法

スライドショーは Web ページでよく見られます。美しい写真が使われています。こちらは純粋な CSS...

jsネイティブ構文プロトタイプ、__proto__、コンストラクタの徹底的な理解

目次1 はじめに2 前提条件2.1 データ型2.2 それが自身のプロパティであるかどうかを判断する ...

SqlクエリMySqlデータベーステーブル名と説明テーブルフィールド(列)情報

以下では、SQL クエリ ステートメントを使用して、Mysql データベース内のテーブルのテーブル名...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

Dockerでmongodbデータベースを使用するための実装コード

mongoイメージを取得する sudo docker pull mongo mongodbサービスを...

Linux 環境で crontab コマンドを使用して、スケジュールされた定期的な実行タスクを設定します (PHP 実行コードを含む)

この記事では、Linux 環境で crontab コマンドを使用して、タスクの定期的な実行をスケジュ...

Docker に Elasticsearch 7.6.2 をインストールするチュートリアル

DockerをインストールするDocker をインストールする必要がありますが、それ以上の指示はあり...

EF (Entity Framework) の挿入または更新データ エラーの解決方法

エラー メッセージ:ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響を与...

HTML 中国語文字エンコード標準の概要

HTML では、Web ページで使用されるエンコーディングを指定する必要があります。一般的な指定方法...