引言
数据库索引的重点知识梳理~
1、索引是什么,有什么作用,有何优缺点?
索引是帮助Mysql高效获取数据的一种数据结构,通常用B树,B+树实现(Mysql不支持hash)
2、为什么用B+树而不用B树,B+树有什么优势?
(1)IO代价更低。B+树由于非叶子节点中不存放data,因此可以存放更多的索引值(单个大节点的容量固定,每个小单位size变小了),从而使得树的高度更低,磁盘IO次数更少。
(2)查询效率稳定。B+树由于所有data都放在叶子节点中,因此每次查询都要走完整的根节点到叶子节点的路径,所有查询的路径长度相同,查询效率更加稳定。
(3)更利于范围查询。B+树叶子节点之间有指针,注意是双向的指针,更利于范围查询。
案例分析:索引如何支撑千万级表的快速查找?(B+树)
Mysql底层用B+树存储索引,假设现在用3层B+树来存储(层数越少,磁盘I/O次数越少),我们来看一共能存多少行数据:
(1)Mysql规定一个页面大小为16KB(即图中一个大节点),假设现在存的数据字段是bigint型的,占8B,指针根据底层源码规定占6B,则一个大节点一共可以存放索引记录共16KB/(8+6)B=1170,则叶子节点的节点个数共有1170x1170个。
(2)假设叶子节点中一个索引+data占用1KB,则一个节点中可存放索引+data记录共16KB/1KB=16个。
(3)因此叶子节点层一共能存放索引+data记录数目为1170*1170*16=2190 2400
(4)因此3层B+树即可存放两千万以上的数据