ITPub博客

首页 > 数据库 > MySQL > mysql innodb体系结构--初级

mysql innodb体系结构--初级

原创 MySQL 作者:czxin788 时间:2015-09-21 21:49:45 0 删除 编辑

 

MySQL innodb体系结构

<!--more-->

 

2015年9月20日星期日 20:00—20:40,我观看了博森瑞的关于mysql体系结构网络公开课,这次课程简单介绍了innodb存储引擎的一些内部结构,只是抛砖引玉,给大家开了头,更多的内容还需要再学习,这些显然是不够的。

                   期待博森瑞的下次网络公开课。

 

 

 

上图中的parse是查询分析器组件。

Enterprise management services是管理服务和工具组件

 

 

mysql的体系结构包括server层和存储层。其中server 层包含连接层和sql层。

 

         下面来看客户发出一条select语句经过的路径。

1、一条sql先进内存池query cache(在oracle先进library cache,library cache里面会缓存这条sql语句的执行计划)。在mysql query cache中,先判断这个sql语句在query cache里面有没有缓存。如果有缓存,那么还要判断这条sql有没有权限访问数据库(mysql.user表判断,即用户名密码是否对等),如果有权限,直接把内存中的结果返回给用户。

2、如果query cache没有这个sql。那么这个sql就进入解析器(因为计算机只认识二进制语言,而不认识select这种文本语言,所以需要mysql的解析器把sql文本语句解析成计算机认识的二进制语言,即解析数)。

         3、然后这条sql进入预处理环节,用来处理解析器没有把sql解析好的,预处理再把这样的sql重新处理一下。

         4、然后sql进入查询优化器,在此环节对sql语句中的join,排序进行优化。

         5、然后通过程序的api接口调用这条sql。

         6、最后sql进入存储层,通过存储引擎到最底层去提取数据,然后把数据返回给用户。

 

 

innodb包含innodb buffer pool,buffer pool是决定数据库性能的。

purge thread是用来管理undo数据的保留时间的(oracle是默认保存undo 15分钟)。

 

master thead 用来管理子线程,提醒子进程什么时候去工作。

oracle花费74亿美元收购Mysql,足以说明mysql的价值。

 

innodb log buffer就是redo log buffer。

一条sql先到内存中找数据,如果内存中没有数据,就需要到磁盘上去找数据。在磁盘上找到数据后,再把数据缓存到内存中,以便下次直接从内存中读取数据。

数据真正存储在页中,当sql找到数据后,再把页中数据放到内存中,页中的数据进入内存中后,就叫 buffer了。简单的说,数据在磁盘中叫page页,把页中数据放到内存中,就叫buffer了。内存是由一个一个buffer组成的。

内存中的buffer是由链(即chain)来管理

内存命中率:我们希望内存缓冲更多的热数据。

 

innodb通过逻辑存储单元(即段、区、页)来存储数据。

一个表就是一个段。

一个大段可以由4个区组成,一个区又是由64个连续的页组成,一个页是16k。

一张表就是一个段。所以一个区大概是1M(64*16k=1M),一个段大概是4M。

页是Mysql  innodb存储引擎 i/o的最小单位。

 

页里包含页头,页中,页尾。

页头包含事务信息,指针信息。

把页信息映射到内存的buffer中。一个buffer包含前后指针的信息,能够通过后一个指针去找下一个buffer。所以我们就可以根据链表结构把buffer串起来。

 

innodb是双向链表(即buffer前后都有指针),把buffer串起来。

 

buffer有三种状态:

a、  free,从来没有被用过的buffer;

b、  clean,干净的,磁盘上的数据和内存buffer中的数据是完全一样的;

c、  dirty,内存buffer中的数据和磁盘数据不一致,即内存buffer中的数据还没来得及刷到磁盘中。

 

mysql的零碎知识点太多了,但是入门简单。

 

 当然,链也有三种状态:

a、  free list(针对free buffer来说),这种链会把从来没有使用过的buffer给串起来(不过,对于生产中跑起来的数据库,基本不存在free list了);

b、  lru list(针对clean buffer来说的),该链是用来串和磁盘数据一样的buffer。在lru list会把最近最少使用的放在lru链表中。我们知道,有的数据经常被访问,有的数据是很少被访问。那么,对于很少被访问的buffer可以被新进来的buffer数据覆盖掉。所以,可以用lru list把clean buffer串起来。在lru list上的是clean buffer,这些buffer可以被新buffer数据覆盖,以循环使用内存空间。

c、  flush list (针对dirty buffer来说的), flush list上放的是脏块,用来告诉哪些buffer该刷新到磁盘上了。write thread会到flush list上去找哪些buffer该刷到磁盘上了。flush list也分为最近最少被脏的。数据库会把最近最少使用的脏数据挂到flush list上,等数据库不繁忙的时候,write thread就会把flush list上的脏块写到磁盘上。

 

以上是三种buffer状态和三种链表状态。

 

innodb三大特性也在内存池中。

不要小看mysql数据库。

 

 

mysql是单进程多线程的数据库。

 

 

 

段、区、页(oracle是块)。

        

 





附件列表

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28916011/viewspace-1805592/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-03

  • 博文量
    233
  • 访问量
    858413