mysql介绍
前言
mysql架构体系
mysql体系介绍
mysql存储引擎
mysql数据结构的演变过程
mysql为什么要选择b+tree
总结
前言
闲暇时光无限美好,小编最近很是轻松,入职一家新公司,每天搞点小迭代,正好自己的时间就很充足,东看看,西瞅瞅,一个技术栈看上几天,就换另外的技术栈,很显然广度是有了,但是深度不够、日后小编跟着大家一起探索学习,文档中有不对的大家一定要指出来啊。。。
mysql架构体系
更简化易懂的架构图
mysql体系介绍
mysql的整体架构一共分为以下4层
· 应用层
应用层是MySQL体系架构的最上层,主要包含 连接、用户鉴权、安全管理
1. 连接处理
当一个客户端向服务端发送连接请求后,MySQL server会从线程池中分配一个线程来和客户端进行连接,以后该客户端的请求都会被分配到该线程上。MySQL Server为了提高性能,提供了线程池,减少了创建线程和释放线程所花费的时间。
2. 用户鉴权
当客户端向MySQL服务端发起连接请求后,MySQL server会对发起连接的用户进行鉴权处理,MySQL鉴权依据是: 用户名,客户端主机地址和用户密码
3. 安全管理
当客户连接到MySQL server后,MySQL server会根据用户的权限来判断用户具体可执行哪些操作。MySQL 提供的部分权限的如下:
· 服务层
1. 连接器
主要建立客户端与mysql-service之间的通信,包括用户的认证,权限。
2. 分析器
sql命令执行到分析器,会验证sql的语句是否合法。
3. 优化器
sql在执行之前都会经过优化器进行优化。
4. 执行器
主要跟存储引擎进行交互,进行数据的CRUD。
5. 缓存
查询缓存,如果缓存中存有命中的数据,查询语句会直接查询缓存。
· 存储引擎层
INNODB、myisam、memory
· 物理文件层
redo.log 、undo.log、error.log、binary log
mysql存储引擎
不同文件的组织形式,使用的存储引擎也不同
1、MyISAM
使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件。
(1) .frm文件 存储表的定义数据
(2).myd文件 存放表中的数据
(3).myi文件 存储索引
2、innoDB
使用这个存储引擎,在磁盘上存储成两个文件。
(1) .frm文件 存储表的定义数据
(2) .ibd文件 存放数据+索引信息
两种存储引擎在数据库里如何存
~ Myisam
上面提到了myisam存储引擎,数据的存储形式是非聚集形式,数据和索引都会单独的存储,叶子节点和非叶子结点都会存储数据,如上图索引的叶节点都会存放数据文件对应的地址,如图所示: 比如查找ID=49的数据 primary key.代表我们主建索引,先利用索引数找到对应的索引文件,然后通过索引文件,找出关联数据的地址 0*90 然后找出数据文件frm文件中的数据
innodb存储引擎只有在叶子节点才会存储数据,且数据和索引是存储在一个文件的,对比MyiSam ,myisam则先去找数据地址,然后在根据地址找对应的数据,innodb会通过主键索引然后找到对应的叶子节点,叶子节点会存储一行的记录,例如你的mysql只有3个字段,id、name、 age 对应的叶子会存储对应主键的一行记录。
如上图两颗B+tree,左边的tree 代表的是主键的b+tree,我们创建表的时候默认都是自动增长列 auto_increment id,正如上图对应的数据结构。右边的tree则对应创建索引的tree,注意看,右边的叶子节点存放是数据的ID,mysql是有一个回表的概念,这里不多赘述。
mysql数据结构的演变过程
Binary Search Tree
Binary Search tree : 二叉搜索树,二分查找法,最左子树小于最右子树,缺点容易变成单边树如上图...
AVL Tree
AVL Tree: 平衡二叉树,可想而知是为了规避形成单边数,在数据插入的时候采用左旋右旋的方式来保证树的平衡,AVL 树会遵循最左子树和最右子树深度之差不会超过2,假设数据量很大。数据在插入不停的左旋右旋来维护这颗树,删除数据也一样,显然很浪费时间,查询是效率比二叉树高了,但是插入很让人堪忧。。。
Red/Black Tree
Red/Black Tree : 红黑数、上面的AVL 平衡二叉树插入数据和删除数据成本比较高,由此如果我们在插入和删除的时候,条件放宽一点不就正好弥补了这点,这时候红黑树就诞生了,最左子树和最右子树深度之差不会超过最左子树的2倍,AVL是2,红黑树是2倍。
这里可以参考一下这篇文章https://zhuanlan.zhihu.com/p/139907457
mysql为什么要选择b+tree
基本的数据结构我们已了解。一起看下mysql中的数据对应的数据结构。
如图所示 Myisam 数据结构
每个节点都会占用一个磁盘块,每一个磁盘块代表1次IO,然而每个磁盘块包含指针(指向下个磁盘块的地址)、键值、以及对应的数据地址。例如找出ID==8的数据,会先从根节点对比 16、34 则发现 8 < 16 即得到P1的指针。然后找到对应的磁盘块,以此类推。
如图所示 Innodb 数据结构
对比Mysiam数据结构,根据观察, 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。InnoDB的数据文件本身就是索引文件,表的主键索引这棵树的非叶子节点存储的是主键的key值,而叶节点data域保存了完整的数据记录:两者存储的数据量也完全不在一个级别,一般Innobd3层结构足已支撑千万级数据,Mysiam3层树结构才能支持4000多数据量吧,当然实际情况取决于Degree。
总结
MyISAM和InnoDB都是以B+树数据结构存储数据的,但MyISAM的数据文件和索引文件是分开的,InnoDB的数据文件就是索引文件。
MyISAM主索引中的B+树中,叶节点的data域存放的是数据记录的地址,而InnoDB中的叶子节点叶节点data域保存了完整的数据记录。
MyISAM辅助索引中的B+树中,叶节点的data域存放的是数据记录的地址,而InnoDB中的叶子节点叶节点data域保存的是主键的值。