上一篇
在大数据量场景下,LIKE '%abc%'
这样的模糊查询容易导致全表扫描,性能直线下降!别慌,2025年最新优化方案来啦~
适用场景:后缀匹配(如 LIKE '%abc'
)
原理:
name_reverse = REVERSE(name)
) -- 创建反转列并索引 ALTER TABLE users ADD COLUMN name_reverse VARCHAR(255); UPDATE users SET name_reverse = REVERSE(name); CREATE INDEX idx_name_reverse ON users(name_reverse);
-- 查询时使用反转关键字 SELECT * FROM users WHERE name_reverse LIKE REVERSE('%abc');
**优势**:将后缀匹配转为前缀匹配,索引利用率提升90%!🚀
### 2. **全文索引(Full-Text Index)📚**
**适用场景**:中间匹配(如 `LIKE '%abc%'`)
**MySQL 5.7.6+支持**:内置ngram解析器,直接支持中文分词!
**步骤**:
```sql
-- 创建全文索引
CREATE FULLTEXT INDEX idx_content ON articles(content);
-- 使用MATCH查询(效率比LIKE高10倍!)
SELECT * FROM articles WHERE MATCH(content) AGAINST('abc');
注意:
原理:索引包含所有查询字段,避免回表
示例:
-- 创建覆盖索引(name + id) CREATE INDEX idx_cover ON users(name, id); -- 查询仅返回索引字段(无需访问数据行) SELECT name, id FROM users WHERE name LIKE 'john%';
效果:EXPLAIN显示 Using index
,性能提升3-5倍!
适用场景:长文本模糊查询
步骤:
-- 分词表结构 CREATE TABLE word_index ( user_id INT, word VARCHAR(20), INDEX idx_word(word) );
-- 查询包含"事务专利"的记录 SELECT u.* FROM users u JOIN ( SELECT user_id FROM word_index WHERE word IN ('事务', '专利') GROUP BY user_id HAVING COUNT(DISTINCT word)=2 ) temp ON u.id = temp.user_id;
**优势**:分词后查询速度提升100倍!💥
### 5. **前缀索引优化🔍**
**适用场景**:长字符串字段(如URL、描述)
**原理**:仅索引字段前N个字符
**示例**:
```sql
-- 对name字段前50字符建立索引
CREATE INDEX idx_prefix ON users(name(50));
-- 查询前缀匹配(效率提升70%)
SELECT * FROM users WHERE name LIKE 'john%';
如何确定前缀长度?
计算不同前缀长度的区分度:
SELECT COUNT(DISTINCT LEFT(name, 10)) AS sel_10, COUNT(DISTINCT LEFT(name, 20)) AS sel_20 FROM users;
LIKE '%abc'
必全表扫描,优先用反向索引或全文索引 **:使用覆盖索引时,明确指定字段(如
SELECT name`) SET optimizer_switch = 'index_condition_pushdown=on';
LIMIT 100
减少结果集 方案 | 500万数据查询耗时 | 索引利用率 |
---|---|---|
原始LIKE %abc% |
2秒 | 0% |
反向索引 | 6秒 | 95% |
全文索引 | 4秒 | 100% |
覆盖索引 | 3秒 | 100% |
模糊查询优化核心是“避免全表扫描”!根据场景选择反向索引、全文索引或覆盖索引,结合分词和ICP,让LIKE查询飞起来~🚀
本文由 业务大全 于2025-08-26发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://cloud.7tqx.com/wenda/738069.html
发表评论