news 2026/5/23 16:05:31

不懂数据库索引原理?你写的SQL跑的慢如老牛,就等着挨骂吧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不懂数据库索引原理?你写的SQL跑的慢如老牛,就等着挨骂吧

一、索引底层原理:B+树是如何吊打其他数据结构的?

1.1 为什么不用哈希表?

  • 哈希索引:精确查询O(1),但范围查询、排序操作直接崩盘
  • B+树:平衡多路搜索树,保证查询、范围、排序全能打

1.2 B+树核心设计

  • 非叶子节点只存键值,大幅降低树高度(1000万数据只需3~4层)
  • 叶子节点双向链表链接,范围查询如丝般顺滑
  • 所有数据存于叶子节点,查询稳定性极强(任何查询IO次数相同)

1.3 磁盘IO才是瓶颈

  • 机械磁盘随机IO:10ms/次
  • B+树10M数据:3次IO → 30ms
  • 全表扫描:10000次IO → 100秒
  • 性能差3000倍以上!

二、索引四大使用原则:违反一条性能血崩!

2.1 最左前缀原则

  • 索引(a, b, c)
  • ✅ 能用:a=?a=? and b=?a=? and b=? and c=?
  • ❌ 不能用:b=?c=?b=? and c=?
  • 原理:B+树按索引定义顺序构建,跳字段如同查字典跳过拼音首字母

2.2 避免索引失效

  • ❌ 对索引列计算:WHERE age+1>20
  • ❌ 前导模糊匹配:WHERE name LIKE '%张'
  • ❌ 隐式类型转换:WHERE varchar_col=123(应写’123’)
  • ❌ OR一侧无索引:WHERE a=1 OR b=2(若b无索引,全表扫描)

2.3 索引选择性原则

  • 公式:索引选择性 = 不重复值数量 / 总记录数
  • 性别(男/女):选择性≈0.5 →不值得单独建索引
  • 手机号:选择性≈0.99 →极品索引字段
  • 技巧:低选择性字段可搭配高选择性字段建联合索引

2.4 覆盖索引优先

  • SELECT *→ 大概率回表查询
  • SELECT 索引包含字段→ 无需回表,性能翻倍
  • 效果:减少50%磁盘IO,速度提升100%

三、六大优化实战:从青铜到王者的秘诀

3.1 EXPLAIN命令必看字段

  • type:至少达到ref(索引访问),杜绝ALL(全表扫描)
  • key:确认实际使用的索引
  • rows:预估扫描行数(超过1000需优化)
  • Extra:杜绝Using filesortUsing temporary

3.2 联合索引优化技巧

  • 场景:查询WHERE a=? and b=?,排序ORDER BY c
  • 方案:建(a, b, c),同时优化查询和排序
  • 原理:B+树叶子节点按索引排序,避免额外排序操作

3.3 大数据分页优化

  • LIMIT 100000,20:先扫描100020行,再丢100000行

  • 子查询优化

    SELECT * FROM table
    INNER JOIN (
    SELECT id FROM table
    WHERE condition
    ORDER BY index_field
    LIMIT 100000,20
    ) AS tmp USING(id)

  • 效果:100ms → 2ms,提升50倍

3.4 索引碎片定期维护

  • 频繁增删导致索引碎片增多,性能下降
  • 每月执行ALTER TABLE table REBUILD INDEX index_name

3.5 杜绝过度索引

  • 每个索引:写操作变慢 + 占用磁盘

  • 排查无用索引

    SELECT * FROM sys.schema_unused_indexes;

  • 维护成本:索引数不宜超过表字段数的30%

3.6 热点数据分离

  • 超大表(十亿级)采用分区表+局部索引
  • 冷热数据分离:热数据索引内存加载,冷数据索引磁盘存放

四、血泪案例:这些坑踩过才知道痛

4.1 隐式转换灾难

  • 字段:phone VARCHAR(20)
  • 错误:WHERE phone = 13800138000(未加引号)
  • 结果:索引失效,全表扫描,数据库CPU100%持续2小时

4.2 联合索引顺序错误

  • 索引:(age, city)
  • 查询:WHERE city='北京' AND age>25
  • 结果:仅能用到age索引,city条件依旧全表扫描

4.3 OR条件未优化

  • 查询:WHERE a=1 OR b=2

  • 错误:仅a有索引

  • 优化:改为UNION ALL

    SELECT * FROM table WHERE a=1
    UNION ALL
    SELECT * FROM table WHERE b=2

  • 效果:5秒 → 0.1秒


结语:索引玩得溜,升职加薪快!

  • 初级程序员:疯狂写SQL
  • 高级程序员:疯狂优化SQL
  • 架构师:设计让SQL跑得快的库表结构

现在行动起来

  1. 打开慢查询日志
  2. 用EXPLAIN分析每个慢查询
  3. 遵循索引四大原则
  4. 定期监控索引使用情况

数据库不会说谎,性能说明一切!

PS:在评论区说出你被索引坑得最惨的一次经历,点赞送《分布式索引设计精髓》电子书!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 18:10:04

企业数字化转型中,小程序商城成线上线下关键连接点

在当下企业朝着数字化转型迈进的历程当中,小程序商城已然变成了连通线上流量跟线下服务的关键连接点。这样一种轻量级的应用形式,依靠它不需要进行下载、使用完马上就能离开的便利特点,以及借助微信、支付宝等超级应用既有所属的庞大用户根基…

作者头像 李华
网站建设 2026/5/20 18:32:11

【张量等变学习】张量学习与正交,洛伦兹和辛对称

目录一、研究背景与意义二、核心概念定义1. 张量相关定义一、研究背景与意义2. 不变性与等变性3. 各向同性张量与特殊张量4. 关键群定义三、核心理论成果1. 正交群等变多项式函数(O(d)O(d)O(d)-Equivariant Polynomials)定理1(O(d)O(d)O(d)-等…

作者头像 李华
网站建设 2026/5/11 10:40:08

震惊!AI Agent架构的“五脏六腑“全曝光!从底层到SaaS平台,5层架构带你秒懂大模型Agent开发(附全景图)

下面是一个科普式总结,适合不了解这块的同学! 下面按照“底层执行引擎 → 任务编排 → 多 Agent 协作 → 应用级框架 → SaaS Agent 平台”五层给你分层总结,覆盖大公司、初创公司、开源社区。 业界主流 Agent Infra 全景图 Layer 5: SaaS Ag…

作者头像 李华
网站建设 2026/5/23 7:10:18

【python大数据毕设实战】天猫订单交易数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

作者头像 李华