mysql io描述
mysql的io就是从磁盘上读取数据写入到内存,这是一次io操作,
从内存中读取数据写入到磁盘,也是一次io操作
页描述
mysql的底层是根据页存储数据的,一页就是16kb=16384b
每一个节点,都是一页数据
第一层叫做根节点,也是非叶子节点
最后一层叫做叶子节点
不是最后一层的,都叫做非叶子节点
页与页之间存在着双向链表,减少io操作
mysql在读取数据的时候,不是从磁盘一行一行的拿数据,而是一页一页的拿
节点存放的内容
非叶子节点存储的都是主键的值,和页码,也就是指向下一层节点的位置
叶子节点会存储完整的数据,也就是你的表里面的每一行数据,也叫做行记录
非叶子节点存放的数据
我们的主键是bigint类型,那么就是占8个字节,页码是6个字节,一共14个字节
那么非叶子节点的一页数据,就是16kb/14b
也就是16384b/14b=1170条数据
叶子节点存放的数据
假设一行能放1kb的数据,那么一页数据就能放16条,
也就是说一个叶子节点就能放16条数据
mysql数据存放的位置
通过下面的命令查看存储的目录
show VARIABLES like '%datadir%'
进入linux中对应的位置,如果是使用docker安装的,那么就需要进入容器里面
可以看到dmg就是我们自己创建的数据库,然后进入dmg
可以看到,有一个t_user.ibd文件,这个就是自己的表的索引和数据存放的信息
查看这个文件,可以看到其中的一些内容,就是我们表里面的数据
2层b+树能够存放多少数据
第一层的非叶子节点有1170个数据,第二层每个叶子节点都有16条数据
那么2层的b+树一共就是1170*16=18720条数据
3层b+树能够存放多少数据
第一层的非叶子节点有1170个数据
第二层的每一个非叶子节点有1170个数据
第三层的每一个叶子节点有16条数据
那么3层的b+树一共就是1170*1170*16=21902400=2千多万的数据
在mysql进行select查询的时候,最多3层io就能查询到数据
注意这里的是3层io,不是3次io
那么最终的结论就是,mysql的b+树高度,最多3层或者4层
如果一张表的高度超过了3层,那么就要考虑分库分表了