当前位置: 首页 > article >正文

MYSQL中 find_in_set() 函数实战:从语法到场景的深度解析

1. 揭开find_in_set()函数的神秘面纱第一次在项目中看到find_in_set()这个函数时我也是一头雾水。它看起来和IN操作符很像但又有明显的不同。经过多次实战应用后我发现它其实是处理逗号分隔字符串的利器。这个函数的语法非常简单FIND_IN_SET(str, strlist)。其中str是要查找的字符串strlist是用逗号分隔的字符串列表。当str存在于strlist中时函数会返回其位置索引从1开始计数否则返回0。如果任一参数为NULL则返回NULL。-- 基本用法示例 SELECT FIND_IN_SET(b, a,b,c,d); -- 返回2因为b在第二个位置 SELECT FIND_IN_SET(x, a,b,c,d); -- 返回0因为x不存在这里有个特别容易被忽视的细节当strlist中只有一个元素时这个函数依然能正常工作。比如SELECT FIND_IN_SET(1, 1)会返回1而不是像某些开发者预期的那样报错。2. find_in_set()与IN、LIKE的深度对比2.1 与IN操作符的较量很多新手容易混淆find_in_set()和IN操作符它们确实有些相似但适用场景完全不同。我通过一个实际案例来说明区别CREATE TABLE products ( id INT PRIMARY KEY, tags VARCHAR(255) -- 存储产品标签如电子,数码,新品 ); -- 插入测试数据 INSERT INTO products VALUES (1, 电子,数码,新品), (2, 家居,新品), (3, 食品);现在要查询所有带有新品标签的产品-- 错误用法IN操作符 SELECT * FROM products WHERE 新品 IN (tags); -- 这个查询不会返回任何结果因为IN把整个tags字段当作一个值 -- 正确用法find_in_set() SELECT * FROM products WHERE FIND_IN_SET(新品, tags) 0; -- 这会正确返回ID为1和2的记录关键区别在于IN操作符比较的是整个字段值find_in_set()比较的是字段中逗号分隔的各个子串2.2 与LIKE操作符的对比LIKE操作符也能实现类似功能但存在明显缺陷-- 使用LIKE查询 SELECT * FROM products WHERE tags LIKE %新品%;这种写法有三个问题性能较差无法使用索引可能出现误匹配如新品推荐也会被匹配无法精确定位到逗号分隔的独立元素find_in_set()则能精确匹配到独立的标签项避免了这些问题。3. 函数的核心机制与性能优化MySQL对find_in_set()有一个很巧妙的优化当第一个参数是常量字符串第二个参数是SET类型列时会使用比特计算来加速查询。这种优化使得它在处理SET类型时性能极佳。虽然实际开发中我们更多使用VARCHAR存储逗号分隔值但了解这个机制有助于理解函数的设计初衷。对于高频查询的字段可以考虑改用SET类型来获得更好的性能。-- SET类型列示例 CREATE TABLE events ( id INT PRIMARY KEY, days SET(Mon,Tue,Wed,Thu,Fri,Sat,Sun) ); -- 查询包含周二的记录 SELECT * FROM events WHERE FIND_IN_SET(Tue, days);4. 典型应用场景解析4.1 文章标签系统这是find_in_set()最经典的应用场景。假设我们有一个文章表CREATE TABLE articles ( id INT PRIMARY KEY, title VARCHAR(100), type VARCHAR(50) -- 存储文章类型如1,3,5 );要查询所有包含类型3热点的文章SELECT * FROM articles WHERE FIND_IN_SET(3, type) 0;这种设计虽然违反了第一范式但在某些简单场景下确实能减少关联表的数量提高查询效率。4.2 部门层级查询在组织架构查询中find_in_set()也能大显身手。假设部门表结构如下CREATE TABLE departments ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50), ancestors VARCHAR(255) -- 存储所有上级部门ID如100,101,105 );要查询部门ID为100的所有子部门SELECT * FROM departments WHERE FIND_IN_SET(100, ancestors) OR dept_id 100;这种设计避免了递归查询在层级不深的情况下性能表现良好。4.3 用户权限检查在多角色系统中用户可能同时属于多个角色CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), roles VARCHAR(100) -- 如admin,editor,auditor ); -- 检查用户是否具有admin角色 SELECT * FROM users WHERE FIND_IN_SET(admin, roles);5. 实战中的陷阱与解决方案5.1 逗号问题find_in_set()最大的限制是它依赖逗号作为分隔符。如果查询的字符串本身包含逗号函数就会出错SELECT FIND_IN_SET(a,b, a,b,c); -- 返回0无法正确匹配解决方案是确保存储的值不包含逗号或者使用其他分隔符如竖线|并自定义函数处理。5.2 性能考量虽然find_in_set()很方便但在大数据量表上性能可能成为瓶颈。我曾经在一个百万级数据表上使用它查询耗时达到秒级。解决方案包括对高频查询字段建立函数索引MySQL 8.0支持考虑改用关联表设计使用全文索引替代-- MySQL 8.0函数索引示例 CREATE INDEX idx_tags ON products((FIND_IN_SET(新品, tags)));5.3 排序与分页find_in_set()的返回值可以用于排序这在某些场景下很有用-- 按标签优先级排序 SELECT * FROM products WHERE FIND_IN_SET(新品, tags) 0 ORDER BY FIND_IN_SET(新品, tags);6. 替代方案探讨虽然find_in_set()很方便但在复杂场景下我们可能需要考虑其他方案关联表设计完全符合范式但需要更多JOIN操作JSON类型MySQL 5.7支持提供更丰富的查询功能全文索引适合文本搜索场景-- JSON类型示例 CREATE TABLE products_json ( id INT PRIMARY KEY, tags JSON ); -- 查询包含新品的记录 SELECT * FROM products_json WHERE JSON_CONTAINS(tags, 新品, $);在实际项目中我通常会根据数据规模、查询频率和复杂度来选择合适的方案。对于简单的标签系统find_in_set()仍然是一个轻量高效的解决方案。

相关文章:

MYSQL中 find_in_set() 函数实战:从语法到场景的深度解析

1. 揭开find_in_set()函数的神秘面纱 第一次在项目中看到find_in_set()这个函数时,我也是一头雾水。它看起来和IN操作符很像,但又有明显的不同。经过多次实战应用后,我发现它其实是处理逗号分隔字符串的利器。 这个函数的语法非常简单&#x…...

AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质

AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质 你是否遇到过这样的困扰:用AnimateDiff生成的视频创意很棒,但画面总有些小瑕疵?比如人物皮肤上不自然的纹理、背景里莫名其妙的噪点,或是某些区域…...

专业级跨平台资源下载利器:res-downloader一站式网络资源嗅探解决方案

专业级跨平台资源下载利器:res-downloader一站式网络资源嗅探解决方案 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: http…...

别再让运动模糊毁了你的检测!一文搞懂工业相机飞拍里的CMOS传感器与快门速度怎么配

工业相机飞拍实战:CMOS传感器与快门速度的黄金搭配法则 在一条每分钟处理300个瓶盖的高速灌装线上,质检员小王发现相机拍摄的字符总是出现拖影——这已经是本周第三次因图像模糊导致误检停线了。类似场景每天都在全球数以万计的自动化产线上演&#xff0…...

ColorControl开源显示调校工具:从新手到专家的HDR优化之路

ColorControl开源显示调校工具:从新手到专家的HDR优化之路 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 在数字显示技术快速发展的今天&#xff…...

基于ROS的语音控制机器人(一):从零搭建多模态交互系统

1. 从零搭建ROS语音控制机器人的核心思路 第一次接触ROS机器人开发时,我被其分布式架构深深吸引。想象一下:你对着电脑说"前进",树莓派就能驱动小车移动;喊"打开摄像头",机器人立即开启视觉识别—…...

ESLint-Plugin-React 终极配置指南:如何创建适合不同团队的个性化规则组合

ESLint-Plugin-React 终极配置指南:如何创建适合不同团队的个性化规则组合 【免费下载链接】eslint-plugin-react React-specific linting rules for ESLint 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-react ESLint-Plugin-React 是一个专…...

【AI】-----向量数据库核心应用场景

向量数据库核心应用场景 1. 大模型 / RAG 知识库(最主流) 企业内部文档、合同、产品手册语义检索解决大模型幻觉、知识过时问题客服机器人、智能问答、私域知识库 2. 推荐系统 电商:相似商品、猜你喜欢短视频/内容:基于用户兴趣的…...

SD 协议

1、SD 协议科普 SD 协议的全称是 Secure Digital (SD) Interface Protocol,它是由 SD 协会(SDA,Secure Digital Association) 制定的一套标准。 eMMC、SD、SDIO 的关系: SD 卡的协议最初是基于 MMC(MultiM…...

当电力系统遇上MATLAB:手把手玩转SVC设计

基于MATLAB的静止无功补偿系统设计 本设计包括设计报告,仿真工程。 静止无功补偿系统(Static Var Compensator,简称SVC)是一种用于电力系统中动态调节无功功率的装置,主要由以下几个核心组件构成:晶闸管控制…...

Torch-Pruning支持神经辐射场(NERF):3D重建模型压缩终极指南

Torch-Pruning支持神经辐射场(NERF):3D重建模型压缩终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning 神…...

5分钟告别Hackintosh配置难题:OpCore Simplify让普通PC也能轻松运行macOS

5分钟告别Hackintosh配置难题:OpCore Simplify让普通PC也能轻松运行macOS 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经梦想在…...

FireRedASR Pro避坑指南:模型加载报错的快速解决方法

FireRedASR Pro避坑指南:模型加载报错的快速解决方法 1. 常见模型加载问题概述 当你第一次尝试运行FireRedASR Pro时,可能会遇到各种模型加载报错。这些错误通常集中在三个关键环节: 权重文件加载失败:PyTorch版本不兼容导致的…...

从LTE到5G-Advanced:载波聚合(CA)技术演进全解析与网络工程师调试指南

从LTE到5G-Advanced:载波聚合技术深度演进与实战调试手册 当你在凌晨三点的基站机房盯着屏幕上跳动的KPI指标,突然发现某个5G小区下行速率始终无法突破800Mbps——这很可能是一个典型的载波聚合配置问题。作为网络优化工程师,我们每天都在与这…...

3090显卡跑ChatGLM-6B LoRA微调:从内存溢出到完美运行的避坑指南

3090显卡实战:ChatGLM-6B LoRA微调显存优化全攻略 当24GB显存的RTX 3090遇上60亿参数的ChatGLM-6B模型,显存管理就像在悬崖边跳舞。本文将分享如何在这块消费级旗舰显卡上完成LoRA微调的全套实战方案,从版本控制到梯度优化,从错误…...

OpenClaw+Qwen3-32B内容创作流:从提纲到公众号发布的自动化

OpenClawQwen3-32B内容创作流:从提纲到公众号发布的自动化 1. 为什么需要自动化内容创作 作为一个技术博主,我每周至少要产出2-3篇深度文章。最痛苦的时刻不是写作本身,而是面对空白文档时的"冷启动"阶段——从选题构思到完成初稿…...

SRS服务器从编译到实战:Ubuntu环境下的RTMP/WebRTC全协议测试

SRS服务器从编译到实战:Ubuntu环境下的RTMP/WebRTC全协议测试 在流媒体技术快速发展的今天,构建一个高效、稳定的视频服务器成为许多开发者和企业的核心需求。SRS(Simple Realtime Server)作为一款开源的实时视频服务器,凭借其对多种流媒体协…...

Python 3.14 JIT动态优化实战(企业级成本控制白皮书)

第一章:Python 3.14 JIT编译器演进与企业级定位Python 3.14 引入了首个官方集成的、生产就绪的 JIT(Just-In-Time)编译器——PyJIT,标志着 CPython 从纯解释执行向混合执行模型的战略跃迁。该 JIT 并非替代现有字节码解释器&#…...

探索TinyEditor:400字节内的微型全能代码编辑器

探索TinyEditor:400字节内的微型全能代码编辑器 【免费下载链接】TinyEditor A functional HTML/CSS/JS editor in less than 400 bytes 项目地址: https://gitcode.com/gh_mirrors/ti/TinyEditor 在前端开发工具领域,TinyEditor以其极致精简的设…...

终极指南:3分钟掌握原神圣遗物扫描工具Amenoma的完整使用技巧 [特殊字符]

终极指南:3分钟掌握原神圣遗物扫描工具Amenoma的完整使用技巧 🎯 【免费下载链接】Amenoma A simple desktop application to scan and export Genshin Impact Artifacts and Materials. 项目地址: https://gitcode.com/gh_mirrors/am/Amenoma 还…...

SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践

SwiftHub:终极GitHub iOS客户端开发指南 - RxSwift与MVVM-C架构实践 【免费下载链接】SwiftHub GitHub iOS client in RxSwift and MVVM-C clean architecture 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftHub SwiftHub是一款功能强大的GitHub iOS客户…...

RxDataSources编辑功能详解:如何实现TableView的增删改操作

RxDataSources编辑功能详解:如何实现TableView的增删改操作 【免费下载链接】RxDataSources UITableView and UICollectionView Data Sources for RxSwift (sections, animated updates, editing ...) 项目地址: https://gitcode.com/gh_mirrors/rx/RxDataSources…...

Linux文件IO编程实战:用GEC6818开发板上的C程序玩转open/read/write/lseek

Linux文件IO编程实战:GEC6818开发板上的C语言文件操作精要 在嵌入式Linux开发中,文件操作是最基础也是最重要的技能之一。GEC6818作为一款广泛应用于教学和工业场景的开发板,其Linux系统编程能力尤为关键。本文将带你深入理解Linux"一切…...

墨语灵犀基础教程:择源/挥毫/化境/出岫四步完成高质量AI翻译

墨语灵犀基础教程:择源/挥毫/化境/出岫四步完成高质量AI翻译 1. 认识墨语灵犀:不只是翻译,更是数字书童 墨语灵犀是一款基于先进AI技术的深度翻译工具,它将现代翻译技术与古典美学完美融合。这不是一个普通的翻译软件&#xff0…...

3块钱,2小时,他用一张显卡从零训练了一个大模型

3块钱能干什么? 一杯蜜雪冰城都不够。 但有人用3块钱的电费加2个小时,从零训练出了一个能聊天的AI大模型。 这不是段子。是一个在 GitHub 上拿到 41.9k Star 的开源项目,叫 MiniMind。大模型自由,来了 过去两年,所有人…...

如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南

如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 老旧电脑无法流畅运行Windows 11…...

避坑指南:uniapp调用支付宝授权时常见的5个错误及解决方案

Uniapp支付宝授权实战:5个高频错误与深度解决方案 移动应用开发中,第三方授权登录是提升用户体验的关键环节。作为国内主流支付平台,支付宝授权在电商、生活服务类App中应用广泛。但许多Uniapp开发者在实现支付宝授权功能时,总会遇…...

libmill内存管理机制:如何避免协程栈溢出问题的完整指南

libmill内存管理机制:如何避免协程栈溢出问题的完整指南 【免费下载链接】libmill Go-style concurrency in C 项目地址: https://gitcode.com/gh_mirrors/li/libmill libmill是一个为C语言引入Go风格并发编程的轻量级库,它通过协程(c…...

libtorrent会话管理终极指南:10个关键配置参数详解

libtorrent会话管理终极指南:10个关键配置参数详解 【免费下载链接】libtorrent an efficient feature complete C bittorrent implementation 项目地址: https://gitcode.com/gh_mirrors/li/libtorrent libtorrent是一个高效且功能完善的C BitTorrent实现&a…...

本地部署开源推送通知系统 ntfy 并实现外部访问

ntfy 是一款简单、轻量级且功能强大的开源推送通知系统,它的核心目标是让用户或开发者能够轻松地从任何设备、任何地方向自己的手机或桌面发送通知。本文将详细介绍如何在 Linux 系统局域网内部署 ntfy 并结合路由侠实现外网访问局域网内部署的 ntfy 。 第一步&…...