SoFunction
Updated on 2025-04-14

Analysis of the usage of FIND_IN_SET function and INSTR function in MySQL

1. Function definition and syntax

1. FIND_IN_SET function

grammar:FIND_IN_SET(str, strlist)
Function: Find the exact matched substring (str) in a comma-separated string list (strlist) and return its position (starting from 1). If not found, return 0.
Core features

  • Only comma-separated lists (such as "apple, banana, orange") are supported.
  • Requires that the substring is an independent element in the list (such as FIND_IN_SET("apple", "apple,juice") returns 1, but FIND_IN_SET("app", "apple") returns 0).
  • case sensitive.

2. INSTR function

grammar:INSTR(str, substr)
Function: Find the first occurrence position of the substring (substr) in the string (str) (starting from 1), and return 0 if not found.
Core features

Supports arbitrary string search, without relying on separators. Matching is a continuous fragment of the substring (such as INSTR("apple", "app") returns 1). case sensitive.

2. Comparison of essential differences

Contrast dimensions FIND_IN_SET INSTR
Data structure requirements Comma-separated list No special format requirements
Matching rules Exactly match independent elements in the list Fuzzy match any continuous substring
Performance impact Need to traverse list elements, large strings are less efficient Usually more efficient, but depends on index and string length
Use scenarios Multi-value field query (such as labels, classification lists) Universal substring search (such as logs, long text)
Return value logic Element position (starting from 1) or 0 The start position of the substring or 0

3. Actual scenario case analysis

Scenario 1: Query data containing specific tags

  • Suppose there is a field tags in the table articles that store comma-separated tags (such as "mysql, database, optimization").
  • Requirements: Find articles containing the tag "mysql".

Correct usage:

SELECT * FROM articles WHERE FIND_IN_SET('mysql', tags) > 0;

Result: Exactly match independent label elements to avoid misjudgment (such as "mysql-server" will not be matched).

Error usage:

SELECT * FROM articles WHERE INSTR(tags, 'mysql') > 0;

Problem: It may match non-independent elements (such as "mysql" in "mysql-server", resulting in inaccurate results.
Scene 2: Search for keywords in logs
Suppose there is a field message in the table logs, which stores the log text (such as "Error: Connection timeout").
need: Find logs containing the keyword "timeout".
Correct usage:

SELECT * FROM logs WHERE INSTR(message, 'timeout') > 0;

Result: Quickly locate substrings regardless of their context format.
Error usage:

SELECT * FROM logs WHERE FIND_IN_SET('timeout', message) > 0;

Problem: FIND_IN_SET requires a comma-separated list. If the message is not a comma-separated structure, the query will be invalid.

4. Performance and design suggestions

1. Performance comparison

- FIND_IN_SET requires splitting and traversing comma-separated lists, with a time complexity of O(n), and is not suitable for ultra-long strings.
- INSTR usually uses optimized string search algorithms (such as Boyer-Moore), which are more efficient, but may still scan full tables due to no indexing.

2. Design suggestions

  • Avoid using commas to separate storage of multi-value fields: It is recommended to use association tables (such as article_tags) to achieve many-to-many relationships to improve query efficiency and standardization.
  • Select the function reasonably:
    • If comma-separated fields must be used, use FIND_IN_SET first to ensure exact matches.
    • For unstructured text search, select INSTR or LIKE.
  • Consider full-text index: For long text fields for high-frequency searches, it is recommended to use MySQL's full-text index (FULLTEXT) to improve performance.

5. Summary

The essential difference between FIND_IN_SET and INSTR lies in the dependency and matching rules of data structures:

  • FIND_IN_SET is designed for comma-separated lists, emphasizing the independence of elements.

  • INSTR is a common substring search tool that does not depend on a specific format.

This is the article about the analysis of the usage and parsing of FIND_IN_SET function and INSTR function in MySQL. For more related contents of mysql FIND_IN_SET function and INSTR function, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!