文章目录
索引的本质
采用Hash精确查找
使用hash可以精确的查找,但是存在问题
select * from t where col>6
对范围查找支持比较差)
采用二叉排序树作为索引的缺点
单边增长时会变得非常长
采用红黑树作为索引的缺点
当表中的数据非常多时,树的高度越来越大,查找的次数越来越多
B树的结构
借鉴红黑树的思想,对每个节点存储多个索引
- 叶子节点没有指针,对范围查找也不支持
- 同时在非叶子节点存放data,查找效率不一致
- 在非叶子节点存放dtaa,可能造成每页存放的索引个数有限
B+树结构
- 每个节点能存储16kb大小信息,为了存储更多元素将data去除,
MyISAM存储引擎索引实现
在数据库所对应的文件实现有三个文件 分别定义
表的结构
表中的数据
以及表中的索引格式
MyISAM叶子节点存放的是磁盘文件的地址
InnoDB存储引擎实现B+树索引
主键索引/聚集索引
key+data在一起
非聚集索引
要过滤两次,首先找到key所对应的磁盘地址再找到datra
为什么InnoDB表必须有主键,并且推荐使用整型的自增主键
MySQL设计的时候是按照B+树组织的
为什么推荐使用整型的自增主键?
- 使用整型比较的比较快,使用字符串比较大小需要进行大量的比较,比较性能比较差(
不使用UUID
)’- 使用自增主键(B+树从左到右依次递增)可以减少维护B+树的成本
联合索引
MySqlB+树三行可以存放多少数据
(1)每页大小为16KB,在每个节点存放一个索引值以及指针
,索引值为bigInt
时对应8字节,对应的指针为6B,则每页可以存放 16KB/14B = 1170个
(2) 第二乘每个pag也对应1170个
(3)假设叶子节点每行记录key+data占用1kb,则每page可以存放16个行
最终计算结果为: 1170117016 = 1000多万行