Eine kurze Analyse des Unterschieds zwischen FIND_IN_SET() und IN in MySQL

Eine kurze Analyse des Unterschieds zwischen FIND_IN_SET() und IN in MySQL

Ich habe die Mysql FIND_IN_SET-Funktion vor einiger Zeit in einem Projekt verwendet und sie kam mir sehr nützlich vor. Nach einer Weile kam der Chef zu mir und sagte, dass dies in IN geändert werden müsse. Haha, er hatte keine andere Wahl, als es zu ändern. Der Grund wird unten analysiert!

Erstellen Sie eine Testtabelle, um den Unterschied zwischen den beiden zu erklären. Kopieren Sie einfach die Testdaten in den Q&A-Bereich. Solange sie das Problem veranschaulichen, ist das in Ordnung. Haha, bitte verzeihen Sie mir, wenn es Ihr Urheberrecht verletzt. Es ist das Internet, also müssen wir es teilen!

Testcode:  
CREATE TABLE `test` ( 
 `id` int(8) NICHT NULL auto_increment, 
 `name` varchar(255) NICHT NULL, 
 `Liste` varchar(255) NICHT NULL, 
 PRIMÄRSCHLÜSSEL (`id`) 
) 
INSERT INTO `test` VALUES (1, 'Name', 'daodao, xiaohu, xiaoqin'); 
INSERT INTO `test` VALUES (2, 'name2', 'xiaohu, daodao, xiaoqin'); 
INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin, daodao, xiaohu'); 
test1:sql = Auswahl * aus ‚Test‘, wobei ‚daodao‘ IN (‚Liste‘); 
Das Ergebnis ist ein Nullwert. 
test2:sql = Auswahl * aus „Test“, wobei FIND_IN_SET(„daodao“, „Liste“); 
Holen Sie sich drei Datenstücke.

Nehmen wir die obigen Versuchsdaten als Beispiel: Das Ergebnis von Test1 ist leer. Warum? Denn in MySQL handelt es sich um einen Vergleich auf Gleichheit. Hier ist „Liste“ ein Feld in der Tabelle, also eine Variable. Sofern sein Wert nicht genau mit dem Wert von „Name“ übereinstimmt, ist das zurückgegebene Ergebnis leer. Nehmen wir als Beispiel Test1. Das heißt, wenn Sie „daodao“ in „daodao, xiaohu, xiaoqin“ ändern, wird der erste Datensatz abgeglichen.

Test2 gibt drei Datenstücke zurück, die möglicherweise das sind, was wir brauchen. Die Funktion FIND_IN_SET in MySQL wird verwendet, um zu vergleichen, ob etwas enthalten ist oder nicht. Sie funktioniert gut, unabhängig davon, ob das Feld „Liste“ eine Variable oder eine gegebene Zeichenfolgenkonstante ist. Der Prototyp in MySQL ist: FIND_IN_SET(str,strlist). Wenn sich der String str in der Stringliste strlist befindet, die aus N Unterketten besteht, liegt der Rückgabewert zwischen 1 und N.

Eine Zeichenfolgenliste ist eine Zeichenfolge, die aus durch die Zeichen „,“ getrennten Teilzeichenfolgen besteht. Wenn das erste Argument eine konstante Zeichenfolge und das zweite eine Spalte vom Typ SET ist, ist die Funktion FIND_IN_SET() für die Verwendung der bitweisen Arithmetik optimiert. Wenn str nicht in strlist enthalten ist oder strlist eine leere Zeichenfolge ist, ist der Rückgabewert 0. Wenn ein beliebiger Parameter NULL ist, ist der Rückgabewert NULL. Diese Funktion funktioniert nicht richtig, wenn das erste Argument ein Komma (',') enthält. str kann auch eine Variable sein, beispielsweise ein Feld in einer Tabelle.

Dies ist natürlich nicht der Grund, warum wir in unserem Projekt FIND_IN_SET durch IN ersetzen müssen, da beide in unserem Projekt dieselbe Funktion erfüllen können. Es ist nur so, dass IN eine höhere Leistung als FIND_IN_SET hat. Das Feld, das wir abfragen möchten, ist der Primärschlüssel. Bei Verwendung von IN wird der Index verwendet und nur ein Teil der Daten in der Tabelle abgefragt . FIND_IN_SET fragt alle Daten in der Tabelle ab. Da die Datenmenge groß ist, ist die Leistung definitiv nicht hoch und wird daher durch IN ersetzt. Wenn Sie sehen möchten, ob die Abfrage teilweise oder vollständig ist, können Sie EXPLAIN, die Erklärungsfunktion, verwenden. Wenn sie teilweise ist, ist der Typ Bereich, und wenn sie vollständig ist, ist der Typ ALLES. Es gibt auch einen Typ const, der ein konstantes Niveau ist, haha. . .

Bewährte Methoden:

1. Wenn die abzufragende Bedingung eine Konstante ist, verwenden Sie IN. Wenn es eine Variable ist, verwenden Sie FIND_IN_SET. Sie können anscheinend den Index verwenden, haha.

2. Wenn sowohl IN als auch FIND_IN_SET die Bedingungen erfüllen können, ist es aus dem gleichen Grund wie oben besser, IN zu verwenden, insbesondere wenn das Abfragefeld der Primärschlüssel ist oder einen Index hat.

3. Wenn die Verwendung von IN die funktionalen Anforderungen nicht erfüllen kann, können Sie nur FIND_IN_SET verwenden. Haha, manchmal kann das Hinzufügen eines %-Zeichens zur IN-Bedingung das Problem auch lösen. Das Hinzufügen eines %-Zeichens zu IN ist nicht nur ein Vergleich auf Gleichheit!

Zusammenfassen

Dies ist der gesamte Inhalt dieses Artikels zum Unterschied zwischen FIND_IN_SET () und IN in MySQL. Interessierte Freunde können sich auf Folgendes beziehen: Vorsichtsmaßnahmen bei der Partitionierung von MySQL-Datenbanktabellen [empfohlen], mehrere wichtige MySQL-Variablen, Analyse der Ausführungsreihenfolge von SQL- und MySQL-Anweisungen usw. Ich hoffe, es wird für alle hilfreich sein. Jeder ist herzlich eingeladen, eine Nachricht zum Austausch und zur Diskussion zu hinterlassen. Wenn es Mängel gibt, wird der Herausgeber diese rechtzeitig korrigieren und ergänzen.

Das könnte Sie auch interessieren:
  • MySQL verwendet die Funktion find_in_set(), um die Sortierung in der Reihenfolge where in() zu implementieren.
  • Einführung in die Verwendung von find_in_set in Mysql
  • So verwenden Sie die MySQL FIND_IN_SET-Funktion
  • Zwei Lösungen für das Problem, dass MySQL in bedingten Anweisungen nur eine Information liest

<<:  So zeigen Sie verfügbare Netzwerkschnittstellen in Linux an

>>:  Vue Virtual DOM – Schnellstart

Artikel empfehlen

Detaillierte Erläuterung des Prozessmanagements im Linux-System

Inhaltsverzeichnis 1. Das Konzept von Prozess und...

Der Unterschied zwischen absolutem und relativem Pfad bei der Webseitenerstellung

1. Absoluter Pfad Zunächst einmal bezieht sich de...

So ändern Sie den Replikationsfilter in MySQL dynamisch

MySQL Replikationsfilter dynamisch ändern Lassen ...

Lösen Sie das Problem des MySQL Threads_running-Surge und der langsamen Abfrage

Inhaltsverzeichnis Hintergrund Problembeschreibun...

Diagramm zur Installation von VMware 14 unter Windows 10

Software-Download Link zum Herunterladen der Soft...

So verwenden Sie Vuex in einem Vue-Projekt

Inhaltsverzeichnis Was ist Vuex? Vuex-Nutzungszyk...

Implementierung eines Docker-Cross-Host-Netzwerks (manuell)

1. Einführung in Macvlan Vor dem Aufkommen von Ma...

Wer ist ein User Experience Designer?

Beängstigend, nicht wahr? Übersetzung im Bild: (v...

Einfaches Tutorial zur Verwendung von Navicat für MySQL

empfehlen: Detailliertes Tutorial zur Registrieru...

Detaillierte Schritte für einen reibungslosen Übergang von MySQL zu MariaDB

1. Einführung in MariaDB und MySQL 1. Einführung ...