最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql中FIND_IN_SET函數(shù)的具體使用

 更新時間:2026年07月24日 09:45:34   作者:探索未知的自己  
本文深入解析FIND_IN_SET函數(shù)的用法、場景與性能陷阱,告訴你為什么它無法使用索引,并分享實用的優(yōu)化替代方案,幫你避開全表掃描的坑,提升查詢效率

FIND_IN_SET 是 MySQL 的一個字符串處理函數(shù),用于在逗號分隔的字符串列表中查找指定值的位置。

一、函數(shù)語法

FIND_IN_SET(str, strlist)
參數(shù)說明
str要查找的字符串
strlist逗號分隔的字符串列表(如 'A,B,C')

返回值:

  • 如果找到,返回 位置(從 1 開始)
  • 如果沒找到,返回 0
  • 如果 str 或 strlist 為 NULL,返回 NULL

二、基本示例

SELECT FIND_IN_SET('B', 'A,B,C,D');   -- 返回 2
SELECT FIND_IN_SET('Z', 'A,B,C,D');   -- 返回 0
SELECT FIND_IN_SET(NULL, 'A,B,C,D');  -- 返回 NULL
SELECT FIND_IN_SET('B', NULL);        -- 返回 NULL
SELECT FIND_IN_SET('B', '');          -- 返回 0

三、常見使用場景

1. 判斷某個值是否在逗號分隔的字符串中

-- 查詢所屬系統(tǒng)包含 '1' 的記錄
SELECT * FROM vehicle 
WHERE FIND_IN_SET('1', belonging_system) > 0;

2. 按逗號分隔字符串排序

-- 按用戶指定的順序排序(如 3,1,2)
SELECT * FROM user 
ORDER BY FIND_IN_SET(id, '3,1,2');

3. 結(jié)合 COALESCE 處理 NULL

-- 如果參數(shù)為 NULL,查詢?nèi)?;否則按 IN 匹配
SELECT * FROM vehicle 
WHERE (?1 IS NULL OR FIND_IN_SET(?1, belonging_system) > 0);

4. 統(tǒng)計某個值出現(xiàn)的次數(shù)

-- 統(tǒng)計 VIN 中包含 'L58' 的記錄數(shù)
SELECT COUNT(*) FROM vehicle 
WHERE FIND_IN_SET('L58', vin) > 0;

四、在你的場景中使用 FIND_IN_SET

場景:belonging_system 是逗號分隔的字符串

-- 查詢 belonging_system 包含 systemId 的所有記錄
SELECT * FROM vehicle 
WHERE FIND_IN_SET('1', belonging_system) > 0;

-- 結(jié)合參數(shù)判空
SELECT * FROM vehicle 
WHERE (?1 IS NULL OR FIND_IN_SET(?1, belonging_system) > 0);

JPA 原生查詢寫法

@Query(value = "SELECT * FROM vehicle v " +
       "WHERE (COALESCE(?1, NULL) IS NULL OR FIND_IN_SET(?1, v.belonging_system) > 0)", 
       nativeQuery = true)
Page<Vehicle> findBySystemId(@Param("systemId") String systemId, Pageable pageable);

五、FIND_IN_SET vs IN

對比項FIND_IN_SETIN
適用場景字段是逗號分隔的字符串字段是單個值
用法FIND_IN_SET('A', column) > 0column IN ('A', 'B')
索引使用? 無法使用索引? 可以使用索引
性能全表掃描,數(shù)據(jù)量大時慢有索引時快
參數(shù)傳遞傳單個字符串需要傳多個值(集合)

核心區(qū)別:

  • IN 用于多個值的列表匹配
  • FIND_IN_SET 用于單個字段中存儲的逗號分隔字符串匹配

六、性能注意事項

?? FIND_IN_SET 無法使用索引,在數(shù)據(jù)量大時性能較差。

數(shù)據(jù)量性能表現(xiàn)
< 1 萬條? 可以接受
1 萬 ~ 10 萬?? 可能變慢
> 10 萬? 嚴重性能問題

優(yōu)化建議

  • 改用關(guān)聯(lián)表(推薦)

    • 將 belonging_system 從逗號分隔字符串改為多對多關(guān)聯(lián)表
    • 使用 IN 或 EXISTS 查詢,利用索引
  • 使用 JSON 數(shù)組(MySQL 5.7+)

    -- 存儲為 JSON 數(shù)組
    SELECT * FROM vehicle 
    WHERE JSON_CONTAINS(belonging_system, '"1"');
  • 使用全文索引

    ALTER TABLE vehicle ADD FULLTEXT(belonging_system);
    SELECT * FROM vehicle 
    WHERE MATCH(belonging_system) AGAINST('1');

七、完整示例

-- 1. 基本查找
SELECT FIND_IN_SET('2', '1,2,3,4');  -- 返回 2

-- 2. 在 WHERE 中使用
SELECT * FROM user WHERE FIND_IN_SET('admin', roles) &gt; 0;

-- 3. 結(jié)合 ORDER BY(按指定順序)
SELECT * FROM product 
WHERE id IN (3,1,2) 
ORDER BY FIND_IN_SET(id, '3,1,2');

-- 4. 結(jié)合 CASE
SELECT 
    name,
    CASE 
        WHEN FIND_IN_SET('admin', roles) &gt; 0 THEN '管理員'
        WHEN FIND_IN_SET('user', roles) &gt; 0 THEN '普通用戶'
        ELSE '未知'
    END AS role_name
FROM user;

八、總結(jié)

要點說明
功能在逗號分隔的字符串中查找值的位置
返回值找到返回位置(1-based),沒找到返回 0
主要場景判斷值是否存在于逗號分隔字段中
優(yōu)點簡單直觀,適合小數(shù)據(jù)量
缺點無法使用索引,大數(shù)據(jù)量時性能差
替代方案關(guān)聯(lián)表、JSON 數(shù)組、全文索引

建議:如果 belonging_system 經(jīng)常被查詢,建議改為多對多關(guān)聯(lián)表,徹底解決性能問題。如果數(shù)據(jù)量?。?lt; 1 萬),FIND_IN_SET 可以接受。

到此這篇關(guān)于Mysql中FIND_IN_SET函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Mysql FIND_IN_SET內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • M1芯片安裝mysql8.0數(shù)據(jù)庫的實現(xiàn)步驟(圖文)

    M1芯片安裝mysql8.0數(shù)據(jù)庫的實現(xiàn)步驟(圖文)

    這篇文章主要介紹了M1芯片安裝mysql8.0數(shù)據(jù)庫的實現(xiàn)實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 使用use index優(yōu)化sql查詢的詳細介紹

    使用use index優(yōu)化sql查詢的詳細介紹

    本篇文章是對使用use index優(yōu)化sql查詢進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL時間溢出原理、影響與解決方案

    MySQL時間溢出原理、影響與解決方案

    本文將手把手帶您了解mysql時間溢出原理、實戰(zhàn)影響與全面解決方案,所有代碼均通過dblens for mysql數(shù)據(jù)庫工具驗證,推薦使用該工具進行可視化數(shù)據(jù)庫管理和開發(fā),感興趣的小伙伴跟著小編一起來看看吧
    2025-03-03
  • Mysql 分批加索引的詳細方法

    Mysql 分批加索引的詳細方法

    文章主要介紹了在生產(chǎn)環(huán)境中為千萬級數(shù)據(jù)表分批次創(chuàng)建索引的策略和方法,包括使用臨時表、分區(qū)表、ONLINE選項、分批ALTER TABLE、pt-online-schema-change工具等,并提供了詳細的步驟和注意事項,感興趣的朋友一起看看吧
    2024-12-12
  • 基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計與實現(xiàn)

    基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計與實現(xiàn)

    本項目是使用Java swing開發(fā),可實現(xiàn)超市管理系統(tǒng)商品列表信息查詢、添加商品信息和修改商品管理以及刪除商品信息和安裝商品信息查詢等功能。界面設(shè)計和功能比較簡單基礎(chǔ)、適合作為Java課設(shè)設(shè)計以及學(xué)習(xí)技術(shù)使用,需要的朋友可以參考一下
    2021-09-09
  • MySQL之初始化數(shù)據(jù)詳解

    MySQL之初始化數(shù)據(jù)詳解

    本文介紹了MySQL命令行的基本操作,包括列出數(shù)據(jù)庫、創(chuàng)建數(shù)據(jù)庫、使用數(shù)據(jù)庫、查看表、刪除數(shù)據(jù)庫、退出MySQL等,還詳細介紹了數(shù)據(jù)庫表的結(jié)構(gòu)和屬性,以及如何創(chuàng)建和初始化測試數(shù)據(jù)
    2025-01-01
  • Django創(chuàng)建項目+連通mysql的操作方法

    Django創(chuàng)建項目+連通mysql的操作方法

    這篇文章主要介紹了Django創(chuàng)建項目+連通mysql的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • MySQL MHA 高可用集群搭建過程詳解

    MySQL MHA 高可用集群搭建過程詳解

    MHA 是一套優(yōu)秀的、開源的 MySQL 高可用性解決方案,它的核心目標是在 MySQL 主從復(fù)制環(huán)境中,實現(xiàn)主庫故障時的自動故障轉(zhuǎn)移和快速切換,盡可能保證數(shù)據(jù)庫服務(wù)的連續(xù)性,這篇文章主要介紹了MySQL MHA 高可用集群搭建指南,需要的朋友可以參考下
    2025-10-10
  • MySQL 互為主備的實現(xiàn)教程

    MySQL 互為主備的實現(xiàn)教程

    本文主要介紹了MySQL 互為主備的實現(xiàn)教程,包括正確編輯my.ini配置文件、確保數(shù)據(jù)庫操作前置條件完成以及避免在關(guān)鍵步驟中修改數(shù)據(jù)庫數(shù)據(jù),以確保配置成功
    2026-06-06
  • MYSQL 沒有完全卸載將導(dǎo)致其安裝不成功

    MYSQL 沒有完全卸載將導(dǎo)致其安裝不成功

    安裝MYSQL不成功,一般是因為服務(wù)器可能安裝過MYSQL而沒有完全卸載。
    2009-06-06

最新評論

辉县市| 宜宾县| 竹溪县| 孝感市| 琼中| 肥西县| 武定县| 略阳县| 垣曲县| 工布江达县| 尉氏县| 沽源县| 奇台县| 裕民县| 塔河县| 鹤庆县| 梅河口市| 达日县| 赤城县| 东乌珠穆沁旗| 兴化市| 石门县| 余江县| 双峰县| 双流县| 阿坝县| 廊坊市| 常熟市| 垦利县| 抚顺县| 武川县| 曲麻莱县| 富阳市| 桦南县| 元江| 兖州市| 上思县| 聂荣县| 吴桥县| 剑阁县| 齐河县|