当前位置: 首页 > 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.jsqmd.com/news/1038075/

相关文章:

  • 新风空调怎么选?4大品牌实测对比,分预算精准推荐 - 信息热点
  • 义乌集群地址注册流程、费用、避坑大全 - 资讯纵览
  • ERPNext完整入门指南:如何免费获得企业级ERP系统
  • 2026年南京正规代账公司大揭秘,哪家才是你的最佳之选? - 信息热点
  • 2026年山东高性价比的激光空压机/激光切割空压机源头工厂必选指南 - 资讯纵览
  • OpenClaw:实现服务器环境一键高效恢复的先进解决方案
  • 2026年国产化工控机选型实测:自主可控嵌入式硬件的推荐榜与众达科技龙芯全系方案解析 - 资讯纵览
  • 2026年临沂短视频哪个公司好:权威数据报告与实战案例。 - 资讯纵览
  • mall项目-购物车模块
  • 2026年精选:口碑靠谱的激光切割专用螺杆空压机厂家推荐 山东性价比之王 - 资讯纵览
  • Gemini Pro定价背后的AI服务真实成本逻辑
  • 重庆可燃气体报警器哪家强?六大品牌多维深度测评 - 资讯纵览
  • 搬家猫深耕北京搬家行业二十载 ,以中式匠心打造本土靠谱搬家品牌 - 信息热点
  • 2026年企业网站SEO基础优化能力评测:十大品牌搜索友好度与流量增长能力对比 - 资讯纵览
  • 抖音无水印下载器终极指南:从零开始构建个人视频资源库
  • 深入分析HCCL集合通信库中Ring AllReduce和Recursive Halving-Doubling两种通信算法在昇腾NPU多卡拓扑上的实现差异,探讨HCCS和RoCE物理链路对算法选择的约
  • 八汇达控股(山东):2026企业数字化营销新选择,GEO优化+豆包广告,助力品牌抢占AI流量高地 - 信息热点
  • 2026年长沙配电箱代理热门厂家选择指南:聚焦服务商解析 - 资讯纵览
  • 2026年全自动吨袋包装称推荐榜单:定量/FFS重膜/高速/底充式螺旋/锂电零排放/铜精粉吨包秤厂家实力解析 - 品牌发掘
  • 2026年 抚顺漏水检测 + 漏水维修|本地正规资质商家,抚顺大禹测漏查漏水检测,卫生间/地暖管/消防/自来水管道漏水检测全覆盖 - 资讯纵览
  • 合肥庐江县管道疏通|维小达|马桶疏通、蹲便器疏通、地漏疏通、洗菜盆疏通、洗手盆疏通、浴缸疏通、主管道清淤一站式养护服务 - 维小达科技
  • 1.ROS和ROS2是什么?
  • 深入浅出:计算机数据存储、数据类型与信号传输底层原理
  • 传统观念:牛市任何策略都赚钱。编程同一策略在牛,熊,震荡市分别回测,量化行情对策略有效性影响。
  • 2026国内双肩包批发定制工厂综合盘点:产能、定制能力与售后全维度评测 - 互联网科技品牌测评
  • 双变量热力图实战:用温湿度联合分布指导共享单车调度
  • 2026年6月北京学生毕业搬家、长短途搬家、居民家庭搬家、公司单位搬迁,同城搬家搬运专业搬家公司联系方式与选择指南 - 信息热点
  • 权威榜单出炉!2026 石家庄婚恋机构排名公布,将爱婚恋六项核心指标登顶行业榜首 - 星际AI
  • 证件照尺寸怎么调整?秒转工具箱内置模板直接选 - 效率工具研究所
  • 大数据工程师转 AI,这套课的数据处理模块够硬吗