索引 B + 树

张开发
2026/4/20 17:22:57 15 分钟阅读

分享文章

索引  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→192. 怎么用 B 树查数据比如我们要找 ID9 的数据先看根节点的797去右边的中间节点看右边中间节点的11911去左边的叶子节点直接在叶子节点的链表上找到9拿到数据地址整个过程我们只需要访问 3 个节点而不用把 10 条数据全看一遍。四B树的核心原理1.【分层有序】结构所有数据都存在最底层的叶子结点中间节点只存【导航用的关键值】不存真实数据叶子节点是有序的链表比如按主键从小到大排好相邻节点之间有指针连接起来2.为什么叫B树BBalance平衡树的左右两边高度差不超过 1不会一边倒保证查询速度稳定。和普通 B 树的区别数据只存在叶子节点中间节点不存数据这样中间节点能存更多关键值树的高度更低查找更快。3.B树为什么比链表普通二叉树好用结构查找 ID9 的过程缺点普通链表从 1 开始一个个往后找要找 5 次数据越多越慢100 万条数据要找 50 万次普通二叉树可能变成 “歪脖子树”比如 1→3→5→7→9退化成链表极端情况下和链表一样慢B 树根→中间→叶子只需要 3 次访问不管数据多少树的高度一般只有 3-4 层超快五索引优化的关键1. 什么是全表扫描就是没有索引的时候数据库只能从第 1 条数据开始一条一条对比直到找到你要的数据。比如你在一个 100 万条数据的表里找name张三没有索引的话数据库要把 100 万条数据都看一遍慢到怀疑人生。2. 怎么用索引避免全表扫描给经常用来查询的字段建索引比如WHERE、JOIN、ORDER 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代表走了索引速度大幅提升

更多文章