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

索引 B + 树

一索引到底是干嘛的?

索引就是数据库里的 目录 ,帮你快速找到数据,不用把整张表翻一遍

二为什么要用B+树做索引

1.查找快:每次查询都能少一半工作量

2.稳定:不管查哪条数据,速度都差不多

3.适合范围查询:比如查【价格100-200】的商品,速度特别快

三极简版B+树

咱们把 B + 树想象成一个多层目录

  • 最顶层:根目录(最顶层节点)
  • 中间层:二级目录(中间节点)
  • 最底层:数据页(叶子节点,存真实数据 / 数据地址)

1.一个简单的例子

设我们存了 10 条数据的主键 ID:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]B + 树会这样组织:

  • 根节点:存关键数字,比如[7],用来帮你判断往左还是往右找
  • 中间节点:比如左边存[3,5],右边存[11,15]
  • 叶子节点:存完整的所有数据,并且用「链表」连起来,顺序是1→3→5→7→9→11→13→15→17→19

2. 怎么用 B + 树查数据?

比如我们要找 ID=9 的数据:

  1. 先看根节点的79>7,去右边的中间节点
  2. 看右边中间节点的119<11,去左边的叶子节点
  3. 直接在叶子节点的链表上找到9,拿到数据地址

整个过程,我们只需要访问 3 个节点,而不用把 10 条数据全看一遍。

四B+树的核心原理

1.【分层+有序】结构

所有数据都存在最底层的叶子结点,中间节点只存【导航用的关键值】,不存真实数据

叶子节点是有序的链表,比如按主键从小到大排好,相邻节点之间有指针连接起来

2.为什么叫B+树

  • B:Balance(平衡),树的左右两边高度差不超过 1,不会一边倒,保证查询速度稳定。
  • +:和普通 B 树的区别,数据只存在叶子节点,中间节点不存数据,这样中间节点能存更多关键值,树的高度更低,查找更快。

3.B+树为什么比链表,普通二叉树好用?

结构查找 ID=9 的过程缺点
普通链表从 1 开始一个个往后找,要找 5 次数据越多越慢,100 万条数据要找 50 万次
普通二叉树可能变成 “歪脖子树”,比如 1→3→5→7→9,退化成链表极端情况下和链表一样慢
B + 树根→中间→叶子,只需要 3 次访问不管数据多少,树的高度一般只有 3-4 层,超快

五索引优化的关键

1. 什么是全表扫描?

就是没有索引的时候,数据库只能从第 1 条数据开始,一条一条对比,直到找到你要的数据。比如你在一个 100 万条数据的表里,找name='张三',没有索引的话,数据库要把 100 万条数据都看一遍,慢到怀疑人生。

2. 怎么用索引避免全表扫描?

  • 给经常用来查询的字段建索引,比如WHEREJOINORDER BY里的字段。
  • 比如你经常按category_id查文章,就给category_id建个索引,数据库会用 B + 树快速定位,不用扫全表。

3. 建索引的小坑(新手必看)

  • 索引不是越多越好:索引会占磁盘空间,而且增删改数据时,数据库还要更新索引,会变慢。
  • 不要给低区分度的字段建索引:比如性别(男 / 女),建了索引也没用,数据库还是会扫全表。
  • 索引要建在经常用的字段上:比如主键、外键、经常用来过滤的字段。

六用SQL验证索引效果

-- 1. 创建一个用户表(100万条数据模拟) CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自带B+树索引 username VARCHAR(20), age INT ); -- 2. 没有索引时,按age查询(全表扫描,很慢) EXPLAIN SELECT * FROM users WHERE age = 25; -- 结果里type列会是ALL,代表全表扫描 -- 3. 给age字段建索引(B+树索引) CREATE INDEX idx_age ON users(age); -- 4. 再查一次,就会走索引了 EXPLAIN SELECT * FROM users WHERE age = 25; -- 结果里type列会是ref,代表走了索引,速度大幅提升
http://www.jsqmd.com/news/672296/

相关文章:

  • PIKE-RAG多智能体规划:如何构建基于事实的创新生成系统
  • **发散创新:基于Python的算法审计自动化框架设计与实战**在人工智能日益普及的今
  • VideoCaptioner终极指南:如何实现视频字幕的完美同步与专业效果
  • AI合规实战指南:算法备案、大模型备案与登记,企业如何精准选择与高效落地
  • 2026年IDE终极对决:Copilot X vs. Codeium vs. 文心编码
  • DAMOYOLO-S实操手册:检测结果JSON转CSV/Excel用于BI工具分析
  • 【X-STILT模型第二期】X-STILT 模型函数详解
  • 数字保险箱密码丢失?这款开源工具帮你找回加密压缩包的访问权限
  • 别再只用默认参数了!手把手教你优化MT5三线KDJ指标,提升交易胜率
  • DialogX基础对话框完全指南:MessageDialog与InputDialog深度解析
  • 用Python和Ursina引擎,10分钟搞定你的第一个3D方块世界(保姆级教程)
  • nli-distilroberta-base完整指南:镜像定制、API封装、健康检查一体化部署
  • docker containerd 13 - 小镇
  • Mahout推荐器选型指南:基于用户、物品还是SVD?看完这篇不再纠结
  • intv_ai_mk11参数详解:Top P采样机制原理与在总结/翻译/创作任务中的最佳实践
  • OpenClaw与系统环境冲突:Windows/Mac系统兼容问题解决指南
  • Pixel Epic智识终端多场景落地:金融/咨询/高校研报自动化实践
  • 小游戏---猜数字+扫雷 保姆级别实现(含源码)
  • 5个步骤掌握Windows风扇控制神器:FanControl完全使用指南
  • 搜索引擎Solr配置
  • 节能50%:电磁炉招商代理真实盈利案例解析 - 速递信息
  • GMGridView编辑模式完全指南:删除、抖动动画与状态管理
  • Python Bilibili API完整指南:从零开始构建B站数据应用
  • 雀魂牌谱屋:基于React TypeScript的麻将数据分析平台架构设计与实现
  • 3步轻松解密RPG Maker游戏:终极资源提取工具完全指南
  • 如何设置 Orwell Dev-C++ 使用自定义 GCC 路径
  • 2026年4月宝珀官方售后网点亲测+避坑指南:实地横评与数据溯源报告(含迁址/新开)|老司机分享全流程记录 - 亨得利官方服务中心
  • 深入Canvas渲染管线:从Rebuild、Rebatch到动静分离,一次讲清Unity UI合批原理
  • YOLO v11真的比v8/v9强吗?我们拿OAK相机和RGB-D数据测了测
  • 从MVDR到LCMV再到GSC:一文讲透自适应波束形成的演进与选择(MATLAB对比)