首页 > 数据库 > MySQL > mysql innodb体系结构--初级
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/ ,如需转载,请注明出处,否则将追究法律责任。