MySQL 索引优化实战:like、order by、join 优化技巧

iT日记 建站运维

MySQL 索引优化实战:like、order by、join 优化技巧-第1张图片-iT日记

数据库查询缓慢、后台加载卡顿、文章列表打开延迟,核心根源大多是索引缺失、索引失效、索引使用不合理。

尤其 ZBlog、各类个人博客、资源教程站点,数据日积月累,无索引或烂索引会直接拖垮服务器性能,拉高 CPU 负载,影响网站稳定性与搜索引擎抓取。

本文结合实战场景,讲解 MySQL 索引原理、常用场景优化方案,包含 like 模糊查询、order by 排序、join 联表查询的完整优化技巧,宝塔环境直接套用。

一、索引核心基础认知

1. 索引的作用

简单理解:

索引 = 数据表目录

无索引 = 全表逐行扫描,数据越大越慢

有索引 = 快速定位数据,查询速度提升数十倍

2. 索引分类

主键索引:PRIMARY,唯一、非空,查询效率最高

唯一索引:UNIQUE,字段值不重复

普通索引:INDEX,日常最常用

复合索引:多个字段组合索引,适合多条件查询

3. 索引不是越多越好

查询多、写入少的表:适合多加索引

频繁新增、修改、删除的表:索引过多会拖慢写入速度

二、like 模糊查询索引优化(高频踩坑)

1. 索引完全失效写法(禁止)

-- 左右通配符,全表扫描,索引直接失效
SELECT * FROM article WHERE title LIKE '%教程%';

-- 左侧通配符,索引失效
SELECT * FROM article WHERE title LIKE '%PHP';

只要 % 出现在前面,B + 树索引无法匹配,直接全表扫描。

2. 有效走索引写法(推荐)

-- 右侧通配符,正常命中索引
SELECT * FROM article WHERE title LIKE 'PHP%';

3. 既要左右模糊查,又要优化方案

业务必须使用 %关键词% 时:

1、选用全文索引 FULLTEXT

2、合理拆分关键词、限制查询条数

3、避免大表高频模糊检索

全文索引示例:

-- 给标题添加全文索引
ALTER TABLE article ADD FULLTEXT INDEX ft_title(title);

-- 全文检索查询
SELECT * FROM article WHERE MATCH(title) AGAINST('Nginx 优化');

三、order by 排序优化,避免文件排序

1. 常见问题

不带索引的排序,会产生 filesort 文件排序,消耗大量 IO 与 CPU,数据量大时极卡。

2. 优化原则

排序字段建立索引

尽量使用主键、自增 ID 排序

避免多字段混合排序

先筛选条件,再排序

3. 正确优化示例

❌ 低效写法

SELECT * FROM article WHERE type=1 ORDER BY addtime DESC;

✅ 优化方案:建立复合索引

-- 条件字段 + 排序字段 组合索引
ALTER TABLE article ADD INDEX idx_type_addtime(type,addtime);

✅ 优化方案:建立复合索引条件筛选 + 排序共用一个索引,完全杜绝 filesort。

4. 小技巧

排序优先使用:

ORDER BY id DESC

自增主键天然有序,索引效率最高。

四、JOIN 联表查询优化(多表必看)

多表关联是慢查询重灾区,博客、评论、分类关联场景大量使用。

1. 核心铁律

1、关联字段必须加索引

2、小表驱动大表

3、只查需要字段,禁止 select *

4、先where 筛选缩小范围,再联表

2. 错误示例

SELECT * FROM article a
LEFT JOIN category c ON a.cid = c.id

cid、c.id 无索引

查询全部字段

无筛选条件,全表关联

3. 优化后写法

-- 关联字段加索引
ALTER TABLE article ADD INDEX idx_cid(cid);
ALTER TABLE category ADD PRIMARY KEY (id);

-- 只查必要字段 + 条件限制
SELECT a.id,a.title,c.name 
FROM article a
LEFT JOIN category c ON a.cid = c.id
WHERE a.status = 1
LIMIT 20;

五、复合索引最左匹配原则(重中之重)

复合索引生效规则:必须满足最左字段
举例:建立索引:idx_a_b_c(a,b,c)
✅ 正常命中索引:
  • where a=?

  • where a=? and b=?

  • where a=? and b=? and c=?

❌ 索引失效:
  • where b=?

  • where c=?

  • where b=? and c=?

建索引时,把高频筛选字段放左边。

六、快速判断索引是否生效

使用 explain 分析 SQL,一键检测优化效果:
explain SELECT * FROM article WHERE title LIKE 'PHP%';

重点看三个字段:

1、type:ALL 代表全表扫描(最差),range、ref、eq_ref 为优秀

2、key:显示实际使用的索引名

3、Extra:出现 Using filesort、Using temporary 代表需要优化

七、站长日常索引优化清单

1、文章表:标题、分类 ID、发布时间、状态 加索引

2、评论表:文章 ID、用户 ID 加索引

3、禁止在大表使用左模糊 %xx

4、列表页排序字段统一建立复合索引

5、定期用 explain 排查后台统计、列表 SQL

6、长期无用索引及时删除,减轻写入压力

八、总结

MySQL 索引优化核心记住三点:

1、前置 % 禁用,右模糊走索引

2、条件 + 排序建复合索引,杜绝文件排序

3、联表字段必加索引,小表带大表

做好索引优化,数据库负载直接下降,页面秒开,服务器更稳定,爬虫抓取顺畅,间接提升网站收录与搜索引擎权重。

上一篇建站必备工具推荐:新手省时省力神器大合集

下一篇当前分类已是最新一篇