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

MySQL 索引优化实战——让查询速度提升100倍

后端开发中,SQL 慢查询是性能问题的头号杀手。90% 的性能问题都能通过合理的索引解决。这篇文章从实战出发,帮你搞懂 MySQL 索引的原理和优化方法。

一、为什么索引能提速

没有索引时,MySQL 要逐行扫描整张表才能找到数据(全表扫描)。有索引后,通过 B+Tree 结构直接定位到目标数据。

数据量无索引(全表扫描)有索引(B+Tree)
1万行~10ms<1ms
100万行~500ms~1ms
1000万行~5秒~2ms

二、索引类型

-- 1. 主键索引(自动创建)CREATETABLEuser(idBIGINTPRIMARYKEYAUTO_INCREMENT);-- 2. 普通索引CREATEINDEXidx_nameONuser(name);-- 3. 唯一索引CREATEUNIQUEINDEXidx_emailONuser(email);-- 4. 联合索引CREATEINDEXidx_name_ageONuser(name,age);-- 5. 全文索引(用于大文本搜索)CREATEFULLTEXTINDEXidx_contentONarticle(content);

三、最左前缀原则

联合索引(name, age, city)相当于创建了三个索引:

-- ✅ 用到索引WHEREname='张三'WHEREname='张三'ANDage=25WHEREname='张三'ANDage=25ANDcity='郑州'-- ❌ 用不到索引WHEREage=25WHEREcity='郑州'WHEREage=25ANDcity='郑州'

核心:联合索引从最左列开始匹配,跳过任何一列,后面的列就失效了。

四、常见索引失效场景

1. 对索引列做了运算

-- ❌ 失效SELECT*FROMuserWHEREage+1=20;-- ✅ 有效SELECT*FROMuserWHEREage=19;

2. 使用了 LIKE 前置模糊匹配

-- ✅ 有效SELECT*FROMuserWHEREnameLIKE'张%';-- ❌ 失效SELECT*FROMuserWHEREnameLIKE'%三';SELECT*FROMuserWHEREnameLIKE'%三%';

3. 使用了函数

-- ❌ 失效SELECT*FROMuserWHERESUBSTR(name,1,1)='张';-- ✅ 有效SELECT*FROMuserWHEREnameLIKE'张%';

4. 类型不一致

-- 假设 phone 是 VARCHAR 类型-- ❌ 失效(隐式类型转换)SELECT*FROMuserWHEREphone=13800008888;-- ✅ 有效SELECT*FROMuserWHEREphone='13800008888';

五、通过 EXPLAIN 分析慢查询

EXPLAINSELECT*FROMuserWHEREname='张三'\G

重点看这几列:

typeconst, ref, rangeALL(全表扫描)
rows越小越好几十万就要注意
ExtraUsing indexUsing filesort(需要优化)
possible_keys有值null(没用到索引)

实战分析

-- 先创建一个模拟表CREATETABLEorders(idBIGINTPRIMARYKEYAUTO_INCREMENT,order_noVARCHAR(64),user_idBIGINT,statusTINYINT,amountDECIMAL(10,2),created_atDATETIME);-- 插入10万条测试数据-- (省略插入语句,实际可以用存储过程)-- 检查慢查询EXPLAINSELECT*FROMordersWHEREstatus=1;-- type: ALL, rows: 100000 → 全表扫描,需要优化-- 加索引后CREATEINDEXidx_statusONorders(status);EXPLAINSELECT*FROMordersWHEREstatus=1;-- type: ref, rows: 50000 → 用了索引,扫描行数减半

六、优化实战场景

场景1:分页查询太慢

-- 慢:OFFSET 越大越慢SELECT*FROMordersORDERBYidLIMIT10000,20;-- 快:用上一页的最大 ID 做条件SELECT*FROMordersWHEREid>10000ORDERBYidLIMIT20;
方式100页1000页10000页
OFFSET~30ms~200ms~2s
ID条件~5ms~5ms~5ms

场景2:排序导致文件排序

-- 需要建立 (status, created_at) 联合索引-- 避免 Using filesortSELECT*FROMordersWHEREstatus=1ORDERBYcreated_atDESCLIMIT10;CREATEINDEXidx_status_createONorders(status,created_at);

场景3:分组统计优化

-- 给 group by 的列加索引SELECTuser_id,COUNT(*)FROMordersGROUPBYuser_id;CREATEINDEXidx_user_idONorders(user_id);

七、索引设计原则

1. 不是越多越好

一张表的索引数量建议控制在5个以内。索引太多会导致:

  • 插入/更新变慢(每次都要维护索引)
  • 占用磁盘空间
  • 查询优化器可能选错索引

2. 高区分度的列才适合建索引

-- 区分度差(只有0和1两个值),索引意义不大-- 索引扫描也要扫一半数据,不如全表扫描CREATEINDEXidx_statusONorders(status);-- 区分度高(每个值都不同),索引效果最好CREATEINDEXidx_order_noONorders(order_no);

3. 优先给 Where 和 Join 的列建索引

-- WHERE 条件列SELECT*FROMuserWHEREname='张三';-- JOIN 关联列SELECT*FROMorderoLEFTJOINuseruONo.user_id=u.id;-- user.id 要有索引

总结

索引优化是后端开发的核心技能,记住三条:

  1. 联合索引遵循最左前缀原则—— 把最常查询的列放最左边
  2. 用 EXPLAIN 分析慢查询—— 重点关注 type 和 rows
  3. 不是越多越好—— 一张表 5 个以内索引足矣

建议在日常开发中,每个 SQL 都养成用 EXPLAIN 看一眼的习惯。


如果对你有帮助,欢迎点赞、评论、关注【张老师技术栈】,持续分享 Java/Python/爬虫 实战干货。

http://www.gsyq.cn/news/1549976.html

相关文章:

  • Gemini Pro定价背后的AI服务真实成本逻辑
  • 搬家猫深耕北京搬家行业二十载 ,以中式匠心打造本土靠谱搬家品牌 - 信息热点
  • 2026年 抚顺漏水检测 + 漏水维修|本地正规资质商家,抚顺大禹测漏查漏水检测,卫生间/地暖管/消防/自来水管道漏水检测全覆盖 - 资讯纵览
  • 八汇达控股(山东):2026企业数字化营销新选择,GEO优化+豆包广告,助力品牌抢占AI流量高地 - 信息热点
  • 合肥庐江县管道疏通|维小达|马桶疏通、蹲便器疏通、地漏疏通、洗菜盆疏通、洗手盆疏通、浴缸疏通、主管道清淤一站式养护服务 - 维小达科技
  • 2026武汉梅雨季节装修指南:旧房翻新防潮防霉全攻略 - 资讯纵览
  • 权威榜单出炉!2026 石家庄婚恋机构排名公布,将爱婚恋六项核心指标登顶行业榜首 - 星际AI
  • 2026 石家庄正规婚介权威榜单出炉!6 家合规靠谱婚恋机构,告别婚托安心脱单 - 星际AI
  • 终极炉石传说插件完整指南:HsMod 55项功能深度解析与专业配置
  • 2026年幼儿园儿童马桶推荐深度测评:如何为你的场景匹配最佳方案? - 信息热点
  • 2026年PEEK注塑厂家:模具开发/精密零件/非标定制,采购选型综合实力分析 - 资讯纵览
  • 特征提取实战:从图像音频时序到工业级可解释特征工程
  • 2026杭州离婚律师高阶挑选指南|八大律所核心评测维度 - 资讯纵览
  • 论事件驱动架构在软件开发中的应用
  • 数字化专访:全国产业数字化现状与中小企业转型通病——对话行业专家谈高低预算策略、2026技术趋势及外包合作
  • 2026年AI投标文件检测与智能编制工具:精准排雷的企业级风控利器 - 资讯纵览
  • 1T大模型的工程价值:如何用小参数实现大效果
  • 为什么选择Anbox:Linux容器化Android运行时的深度技术解析
  • os.path路径处理大全:跨平台拼接、绝对路径、文件属性判断
  • Simple Transformers中文文本摘要实战:3小时快速搭建生产级摘要系统
  • 家里已经有小米设备,想把灯光也接进米家,天津找哪家做比较好?|3类渠道对比
  • 选举预测建模实战:时序民调数据的特征工程与跨周期泛化
  • 特级初榨橄榄油的用途其实很广泛:不同人群该如何科学选择? - 信息热点
  • 2026年益阳羽毛球馆乱象深度揭秘,新手家长需警惕的收费底线 - 资讯纵览
  • 终极指南:如何在Windows 10/11上免费创建虚拟显示器
  • 国内冷缩装配厂家实测排行:核心维度对比一览 - 起跑123
  • 告别手动标注:用Semi_Utils智能水印提升摄影作品专业度
  • pandas多维聚合实战:银行风控中的生产级聚合模式
  • MC92600 Quad DDR SERDES系统设计:启动、待机、中继模式与电源完整性详解
  • MiniMax M2 Agent:开箱即用的AI协作者如何重塑前端开发范式