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

MySQL三种模糊查询方式:​​LIKE、REGEXP和FULLTEXT

概述

  • 在 MySQL 中,模糊查询主要有三种方式:LIKEREGEXP(正则表达式)和 FULLTEXT(全文索引)。它们各有适用场景和性能差异,以下是详细对比和实际应用指南
  • 资料已经分类整理好,喜欢的朋友自取:https://pan.quark.cn/s/f52968c518d3

一、LIKE:基础模糊匹配

特点
• 语法简单:使用 %(任意多个字符)和 _(单个字符)通配符。

• 适用场景:简单的前缀、后缀或中间包含的模糊匹配。

• 性能问题:以 % 开头的模糊查询(如 LIKE '%keyword')无法使用索引,可能导致全表扫描。

示例

-- 查询以 "张" 开头的名字(使用索引,如果字段有索引)
SELECT * FROM users WHERE name LIKE '张%';-- 查询包含 "张" 的名字(无法使用索引)
SELECT * FROM users WHERE name LIKE '%张%';

二、REGEXP:正则表达式匹配

特点
• 灵活性强:支持复杂模式匹配(如数字、字符范围、重复次数等)。

• 适用场景:需要复杂规则的模糊匹配(如邮箱、手机号格式验证)。

• 性能问题:正则表达式通常比 LIKE 更耗资源,大数据量时需谨慎使用。

示例

-- 匹配以数字结尾的名字
SELECT * FROM users WHERE name REGEXP '[0-9]$';-- 匹配包含 "张" 或 "李" 的名字
SELECT * FROM users WHERE name REGEXP '张|李';-- 匹配长度为 3 的中文字符
SELECT * FROM users WHERE name REGEXP '^[\\u4e00-\\u9fa5]{3}$';

三、FULLTEXT:全文索引搜索

特点
• 高效搜索:专为大型文本字段设计(如文章、描述),通过全文索引加速查询。

• 自然语言处理:支持分词、词干提取、停用词过滤(需配置)。

• 限制:

• 仅适用于 MyISAMInnoDB(MySQL 5.6+)引擎。

• 默认不支持中文分词(需借助插件如 ngram)。

• 需要显式创建全文索引。

使用步骤

  1. 创建全文索引:

    ALTER TABLE articles ADD FULLTEXT INDEX ft_title_content (title, content);
    
  2. 查询语法:

    -- 自然语言模式(默认)
    SELECT * FROM articles 
    WHERE MATCH(title, content) AGAINST('数据库 优化' IN NATURAL LANGUAGE MODE);-- 布尔模式(支持运算符 + - ><)
    SELECT * FROM articles 
    WHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
    
  3. 中文全文检索(需启用 ngram 分词):

    -- 创建表时指定 ngram 分词长度
    CREATE TABLE articles (id INT PRIMARY KEY,title VARCHAR(200),content TEXT,FULLTEXT(title, content) WITH PARSER ngram
    ) ENGINE=InnoDB;-- 查询中文
    SELECT * FROM articles 
    WHERE MATCH(title, content) AGAINST('数据库' IN NATURAL LANGUAGE MODE);
    

四、对比总结

方法优点缺点适用场景
LIKE简单易用,支持基本模糊匹配性能差(以 % 开头时)简单前缀、后缀或包含匹配
REGEXP支持复杂模式匹配性能较差,语法复杂格式验证、复杂规则匹配
FULLTEXT高效文本搜索,支持自然语言处理配置复杂,中文支持需额外处理大文本字段搜索(如文章、日志)

五、性能优化建议

  1. 优先使用前缀匹配(如 LIKE '张%'),可触发索引。
  2. 避免全模糊查询(如 LIKE '%张%'),大数据量时改用 FULLTEXT
  3. 对中文全文搜索,考虑使用 Elasticsearch 或 第三方分词插件(如 jieba 分词 + MySQL 集成)。

六、实际选择策略

• 简单模糊查询 → LIKE

• 复杂规则匹配 → REGEXP

• 大文本搜索 → FULLTEXT(需处理中文分词)

• 高并发、大数据量 → 专业搜索引擎(如 Elasticsearch)

小结

根据业务需求和数据规模合理选择工具,避免过度依赖数据库模糊查询!

http://www.xdnf.cn/news/5864.html

相关文章:

  • 携固态电池、新形态钢壳叠片电池等产品 豪鹏科技将亮相CIBF 2025
  • GPT( Generative Pre-trained Transformer )模型:基于Transformer
  • 银行营销风控环节如何实现数字化升级?
  • 南方科技大学Science! 自由基不对称催化新突破 | 乐研试剂
  • 人事管理系统8
  • Redis 主从复制的实现原理是什么?
  • 【Qt】pro工程文件转CMakeLists文件
  • 自动化测试基础知识详解
  • 无人机避障——如何利用MinumSnap进行对速度、加速度进行优化的轨迹生成(附C++python代码)
  • 如何通过 Windows 图形界面找到 WSL 主目录
  • 【Ansys Icepak】带翅片的散热器
  • C++23 views::zip 和 views::zip_transform (P2321R2) 深入解析
  • 嵌入式开发中 C++ 跨平台开发经验与解决方案
  • DAY 24 元组和OS模块
  • 思极地图使用
  • 《算法导论(第4版)》阅读笔记:p39-p48
  • 基于STM32、HAL库的ADAU1701JSTZ音频接口芯片驱动程序设计
  • 【23种设计模式】模式背后运用的技术对照
  • 【Android】下拉刷新组件Swiperefreshlayout
  • 将 swagger 接口导入 apifox 查看及调试
  • android 权限配置
  • ThingsBoard(TODO)
  • 无人机失联保护模块技术解析!
  • 汽车工厂数字孪生实时监控技术从数据采集到三维驱动实现
  • 【神经网络与深度学习】通俗易懂的介绍非凸优化问题、梯度消失、梯度爆炸、模型的收敛、模型的发散
  • 【AI News | 20250513】每日AI进展
  • 贝叶斯优化Transformer融合支持向量机多变量时间序列预测,Matlab实现
  • 遨游卫星电话与普通手机有什么区别?
  • 【学习笔记】计算机操作系统(三)—— 处理机调度与死锁
  • 深入探讨 Java 性能术语与优化实践