当前位置:首页 > 问答 > 正文

数据库优化|查询技巧|mysql模糊查询语句,mysql中模糊查询语句详解与用法

🔍 MySQL模糊查询全攻略:告别慢查询,效率翻倍!

场景引入
凌晨3点,你正喝着第5杯咖啡☕,突然接到老板电话:“用户说搜索名字带‘张’的订单要10秒才能出结果!立刻修复!” 你盯着满屏的LIKE '%张%'语句陷入沉思——是时候彻底搞懂MySQL模糊查询的优化艺术了!


基础篇:MySQL模糊查询三板斧

LIKE 基础语法

-- 匹配以"科技"开头 (使用索引✅)
SELECT * FROM products WHERE name LIKE '科技%';
-- 匹配包含"手机" (全表扫描⚠️)
SELECT * FROM products WHERE name LIKE '%手机%';
-- 匹配第二个字是"想" (全表扫描⚠️)
SELECT * FROM books WHERE title LIKE '_想%';

📌 性能真相

  • 只有'关键词%'能利用索引(最左前缀原则)
  • '%关键词%''_关键词%'会导致全表扫描

特殊字符转义

当搜索"50%折扣"这类含通配符的内容时:

-- 错误示范 ❌
SELECT * FROM ads WHERE text LIKE '%50%%';
-- 正确姿势 ✅
SELECT * FROM ads WHERE text LIKE '%50\%%' ESCAPE '\';

REGEXP 正则查询

适合复杂模式匹配,但性能较差:

数据库优化|查询技巧|mysql模糊查询语句,mysql中模糊查询语句详解与用法

-- 查找包含"华为"或"小米"的商品
SELECT * FROM phones 
WHERE model REGEXP '华为|小米';
-- 匹配以数字开头的订单号
SELECT * FROM orders 
WHERE order_no REGEXP '^[0-9]';

进阶优化:让模糊查询飞起来 🚀

强制索引提示

当优化器犯傻时手动干预:

SELECT * FROM users FORCE INDEX(idx_username) 
WHERE username LIKE '王%';

覆盖索引技巧

避免回表操作,效率提升50%+:

-- 普通查询(需回表)
SELECT * FROM employees WHERE name LIKE '张%';
-- 优化版(仅用索引)
SELECT id, name FROM employees 
WHERE name LIKE '张%';

分词索引方案

对于中文搜索,可用NGRAM分词:

ALTER TABLE articles ADD FULLTEXT INDEX ft_idx_content(content) 
WITH PARSER ngram;
SELECT * FROM articles 
WHERE MATCH(content) AGAINST('数据库优化' IN BOOLEAN MODE);

避坑指南 ⚠️

  1. NULL值陷阱

    -- 不会返回name为NULL的记录!
    SELECT * FROM users WHERE name LIKE '%张%';
  2. 编码问题
    UTF8mb4下_可能匹配多个字符(如emoji👨👩👧👦算1个字符但占多个字节)

    数据库优化|查询技巧|mysql模糊查询语句,mysql中模糊查询语句详解与用法

  3. 隐式转换

    -- 索引失效案例(id是整型)
    SELECT * FROM orders WHERE id LIKE '123%';

性能对比实验 🔬

查询方式 100万数据耗时 是否用索引
LIKE '张%' 02s
LIKE '%张%' 8s
REGEXP '^张' 1s
全文索引(NGRAM) 15s

💡 终极建议

  • 高频搜索字段考虑ES专有搜索引擎
  • 定期执行ANALYZE TABLE更新统计信息
  • 必要时用缓存层缓解模糊查询压力

现在你可以优雅地回复老板:“优化已上线,查询时间从10秒降到0.1秒!” 🎉 (然后补个觉吧)

发表评论