CSDN开篇博客,本来想写下mysql与mongoDB的区别,无奈牵涉的专业知识太多,技术能力也有限,所以分开来介绍下mysql和mongoDB,主要从逻辑架构,存储引擎,数据如何存储,如何查询方面进行分析,参考资料来源于官网和一些大咖的分享,如有不正之处,也希望留言指正。
下图是mysql的逻辑架构,来自高性能MySQL,很简洁,挑不出毛病,
存储引擎介绍
InnoDB 作为Mysql 默认事务型存储引擎,关键特性包括:插入缓冲、两次写、自适应哈希索引、异步IO、刷新邻接页。
InnoDB的数据存储在表空间(tablespace)中,表空间是InnoDB基于文件IO上构建;tablespace采用逻辑分层结构:由段(segment),区(extent)、页(page)组成。
段:常见的段有数据段【B+树的叶子节点】、索引段、回滚段等。
区:区是连续页组成的空间,在任何情况下每个区的大小都为1MB
页:页是InnoDB磁盘管理的最小单位。默认每个页的大小为16KB.常见的页类型有:数据页(B-tree Node),undo页(undo Log Page),系统页(System Page),事务数据页(Transaction systemPage),插入缓冲位图页(Insert Buffer Bitmap),插入缓冲空闲列表页(Insert Buffer Free List),未压缩的二进制大对象页(UncompressedBLOB Page), 压缩的二进制大对象页(compressed BLOB Page),
InnoDB数据页由7个部分组成:FileHeader,Page Header,Infinum+Supermum Records,User Records ,Free Space,PageDirectory,File Trailer.页与页之间通过双向链表连接。
InnoDB存储引擎表总是B+树索引组织的,B+树索引并不能找到一个键值对应的具体行。b+树索引只能查到被查找数据行所在的页,然后数据库通过把页读入内存,再在内存中查找,最后得到结果。
B+树索引有一个特点是高扇出性【子节点非常多】,因此在数据库中,B+树的高度一般在3到4层【假设每个数据页节点的扇出为200,树共3层。以每页200行[每行记录大小约为80字节]记录为例,总共能保存的数据条数就是200^3=800W,】。也就是说查找某一键值的记录,最多只需要3到4次IO开销。按磁盘每秒100次IO来计算,查询时间只需0.0.2到0.03秒。
下面演示一个B+数结构,高度为2,每页可放4条记录,扇出(fanout)【子节点数量】为5
行:InnoDB存储引擎是面向列的(row-oriented),不就是说数据是按行进行存放的。每个页存放的记录也是有硬性定义的,最多允许存放16KB的数据。最多允许存放16KB/2-200也即7992行的记录,最少2条记录,不然就变成链表了。