数据库索引为什么能加速查询
"加个索引就快了"——这句话经常听到,但索引到底是怎么做到的?这篇笔记记录我对索引原理的理解。
没有索引时会怎样
如果一张表没有任何索引,数据库要找某条记录,只能从头到尾一行一行地扫描,这就是"全表扫描"。数据量小时无所谓,一旦有几百万行,每次查询都会很慢。
索引就像目录
可以把索引想象成书的目录。要找某个章节,先翻目录定位页码,而不是从第一页开始翻。索引就是数据库为某些列额外维护的一份"有序目录"。
B+ 树
大多数关系型数据库的索引用的是 B+ 树结构。它的特点是层级很矮、每个节点能存很多键,所以即使数据量很大,从根节点找到目标也只需要很少几次磁盘读取。叶子节点之间还用链表连接,非常适合范围查询。
索引不是越多越好
索引能加速查询,但也有代价:
- 每次插入、更新、删除数据,相关索引也要同步维护,写入会变慢;
- 索引本身要占用额外的存储空间;
- 区分度很低的列(比如"性别")建索引意义不大。
什么时候该建索引
- 经常出现在 WHERE 条件里的列;
- 经常用于排序和分组的列;
- 关联查询时用到的外键列。
可以用 EXPLAIN 查看查询的执行计划,确认是否真的用上了索引、有没有发生全表扫描。
小结
索引的本质是"用空间和写入成本,换取查询速度"。理解了 B+ 树之后,建索引这件事就从"凭感觉"变成了"有依据"。
← 返回首页