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 コマンドライン スクリプトの実行例

この記事では、例を使用して MySQL コマンドライン スクリプトの実行について説明します。ご参考ま...

Ubuntu 18.04 LTSでIPアドレスを設定するための完全な手順

序文Ubuntu 18.04 LTS で IP アドレスを設定する方法は、これまで使用されていた設定...

MySQL ビューの紹介と基本操作のチュートリアル

序文ビューは、データベース システム内で非常に便利なデータベース オブジェクトです。 MySQL 5...

Vueは水平の斜めの棒グラフを実装します

この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...

中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)

PS: 最近、nginx を詳細に紹介している <<High-Performance ...

Docker で FastDFS ファイル システムを構築する (マルチイメージ チュートリアル)

目次FastDFSについて1. 画像を検索する2. イメージをインストールする3.1. 必要なディレ...

XHTML と CSS の Web ページ作成の問題に対する解決策

XHTML CSS ページ制作中に遭遇する問題の解決策は、解決策と呼ぶには少々大げさです。せいぜい、...

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

MySQL の機能: MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレー...

MySQL マスタースレーブレプリケーションの原理と実践の詳細な説明

目次導入効果原理形状練習するこの記事では、例を使用して、MySQL マスター/スレーブ レプリケーシ...

シンプルなナビゲーションバー機能を実現するHTML+CSS

さっそく、コードを見てみましょう(初心者:特に言うことはありません) <!DOCTYPE ht...

Dockerでプロジェクトを実行する方法

1. プロジェクトwarが保存されているディレクトリを入力しますDockerfileを編集する vi...

JavaScript の基本変数

目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....

JavaScript 初心者のための二分探索木アルゴリズムのチュートリアル

目次バイナリ検索木 (BST) とは何ですか?バイナリツリーの基本的な走査(インオーダー、ポストオー...

MySQL マルチテーブルクエリの詳細な説明

よく食べて十分に休息を取るというのは簡単なことのように思えますが、実際に実行するのはそれほど簡単では...

Vueライフサイクルカメラの8つのフック関数

目次1. beforeCreateとcreated関数2. beforeMountとmount関数3...