
数据库查询缓慢、后台加载卡顿、文章列表打开延迟,核心根源大多是索引缺失、索引失效、索引使用不合理。
尤其 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、联表字段必加索引,小表带大表
做好索引优化,数据库负载直接下降,页面秒开,服务器更稳定,爬虫抓取顺畅,间接提升网站收录与搜索引擎权重。


