MySQL 索引原理系列(一):为什么一学数据库索引就懵?
很多人在学习 MySQL 索引时都会经历一个非常痛苦的阶段刚开始学的时候什么是索引为什么会出现 B树、B树主键又是什么聚簇索引、普通索引、回表又是什么感觉所有概念突然一起冲了出来。最后的结果通常是每个词好像都听过但整体完全串不起来。而我最近在学习 MySQL 索引时也正好经历了这个阶段。后来我发现其实并不是索引难而是大部分资料一开始就直接讲 B树导致新人根本不知道这些东西之间到底是什么关系。所以这一篇文章我不打算上来就讲八股。而是从“数据库为什么需要索引”开始一步步把索引 ↓ B树 ↓ B树 ↓ 主键这些概念真正串起来。一、数据库最原始的问题查数据太慢假设现在有一张用户表user id name age 1 Tom 20 2 Jack 22 3 Lucy 19现在执行一条 SQLSELECT * FROM user WHERE id 2;如果数据库没有任何“加速结构”它会怎么做答案是一行一行找。也就是id1 ❌ id2 ✔ id3 ❌这种方式叫全表扫描Full Table Scan数据少的时候问题不大。但如果是100万条 1000万条 甚至上亿条数据那就会非常慢。二、于是数据库需要“目录”这个时候人类会很自然想到一个东西目录。就像一本书没目录 → 一页页翻有目录 → 直接定位章节数据库也是一样。于是索引Index出现了三、索引到底是什么一句话理解索引 数据库提前整理好的一份“查找目录”比如id 数据位置 1 第100行 2 第200行 3 第300行数据库先查“目录”再定位真正的数据。所以索引的本质用空间换时间。四、那索引怎么存储才最快这里就开始引出树结构因为如果数据量很大1 2 3 4 5 ... 10000000普通数组查找、插入、排序都会有问题。于是数据库需要一种查询快 插入快 删除快 还能保持有序的数据结构。于是B树 和 B树出现了五、B树B-Tree是什么B树的核心思想是每个节点都可以存数据。结构类似[30] / \ [10] [50] / \ / \ [5] [20] [40] [60]这里30 是数据10 / 50 也是数据5 / 20 / 40 / 60 也是数据也就是说数据分散在树的各层。B树的特点1、每层都可能有数据查找时可能中途就找到。2、查询路径不固定有时候查2层有时候查3层。3、范围查询不方便因为数据是分散的。六、B树是什么后来数据库发现B树虽然已经很强了但仍然不够适合数据库。于是出现了B树B TreeB树最核心的变化所有数据只放在叶子节点。上层节点只负责导航。结构类似[30] / \ [10|20] [30|50] 叶子节点 10 → 20 → 30 → 40 → 50 → 60七、B树最重要的三个特点1、非叶子节点不存真实数据它们只是目录 导航 路标2、所有数据都在叶子节点这样结构非常统一。3、叶子节点之间形成链表这是 B树最关键的一点。比如10 → 20 → 30 → 40 → 50这样数据库做范围查询时SELECT * FROM user WHERE id BETWEEN 20 AND 50;就会非常快。八、B树 vs B树终于能看懂了对比B树B树数据位置各层都有只在叶子非叶子节点存数据只存索引查询路径不固定固定范围查询一般非常强叶子节点无链表链表结构数据库使用少主流九、主键又是什么讲到这里很多人又会开始懵主键怎么又出来了其实主键很简单。一句话主键 每行数据的唯一身份证比如id 1001这个 id不会重复。数据库会使用主键 B树来组织整个数据结构。于是主键索引出现了。十、终于把关系串起来了到这里我们终于可以把整个链路串起来数据太多 ↓ 全表扫描太慢 ↓ 需要索引目录 ↓ 索引需要高效结构 ↓ 出现 B树 / B树 ↓ 数据库最终选择 B树 ↓ 主键作为唯一标识 ↓ MySQL 用 B树组织主键十一、这一篇你真正需要记住什么其实只需要记住下面三句话1、索引是“目录”作用加速数据查找。2、B树是“索引的实现结构”它不是业务概念。而是数据结构。3、主键是“唯一标识”数据库使用主键 B树来组织数据。十二、结尾很多时候我们不是学不会数据库索引。而是一开始就被各种概念同时轰炸。其实真正的学习顺序应该是为什么需要索引 ↓ 索引是什么 ↓ B树是什么 ↓ 主键索引 ↓ 普通索引 ↓ 回表 ↓ 联合索引只有这样整个知识体系才会真正连起来。下一篇预告下一篇我们正式进入《MySQL 索引原理系列二终于搞懂 B树 和 B树》会真正讲清为什么树结构会出现为什么数据库不用红黑树为什么 MySQL 最终选择 B树B树为什么特别适合磁盘 IO这一篇开始我们正式进入MySQL 索引底层原理。