二叉树
二叉树存储索引时,单边递增退化成链表
查询6这条记录需要经过6次磁盘IO
缺点:元素单边递增退化成链表,性能差
红黑树
红黑树也叫二叉平衡树
,单边递增会自动平衡
查询6元素需要3次磁盘IO
.
缺点:当数据达到几百万时,树的高度不可控,需要很多次磁盘IO, 性能低
B树
B+树
所有索引元素存在于叶子节点上
mysql底层每页存储16KB
的数据
show global status like 'Innodb_page_size';
bigint 占8个字节 +磁盘空白空间占6个字节
16kb/(8+6)k ==1170
当bigint 作为主键索引时,可以放1170个元素
假设一个叶子节点占1kb
那么底层叶子可以放16个索引
1170*1170*16=21,902,400
一颗高度为3的B+树,当所有节点放满后可以存两千万条记录。
B+树 叶子节点从左到右依次递增
查找过程
非叶子节点全部加载到内存
,快速定位到某个节点,只需要一次磁盘IO
由此可知上千万的数据合理走了索引,查询速度非常快。
MyISAM存储引擎
表test_myisam使用的是MyISAM存储引擎
, 查看其表结构
test_myisam.frm 存储表结构信息
test_myisam.MYD 存储表数据
test_myisam.MYI 存储表索引
select *from t where t.col=30
MYSQL底层执行步骤:
- 首先判断条件是否是索引字段
- 不是索引字段,全表扫描
- 是索引字段,在MYI文件上快速定位到30元素
- 通过索引磁盘文件地址在MYD文件快速定位到某行记录