Mysql 数据结构选择

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域保存的是主键的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值