MySQL innodb体系结构

<!--more--&gt

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是块)。

来自为知笔记(Wiz)

附件列表

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

转载于:http://blog.itpub.net/28916011/viewspace-1805592/

mysql innodb体系结构--初级相关推荐

  1. mysql innodb架构_Mysql Innodb体系结构

    Innodb体系结构 Innodb存储引擎主要包括内存池以及后台线程. 内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据.缓存磁盘数据,修改文件前先修改内存.redo log 后台线程: ...

  2. mysql dba系统学习(12)mysql的数据文件 mysql dba系统学习(13)mysql的体系结构

    mysql的数据文件 一,系统参数datadir 在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件 datadir指定 ...

  3. 面试题:一条 sql 语句是如何经过 MySQL 的体系结构的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:有了这 4 款工具,老板再也不怕我写烂SQL了个人原创+1博客:点击前往,查看更多 作者:李福春 来源:http ...

  4. mysql怎么刷题_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?

    {port} -u${user} -p ,输入密码. 使用连接器连接服务端: 连接成功之后,权限修改不会影响当前连接,连接的有效期默认是8个小时: 连接之后,执行过程中使用内存会持续增加,应该定时重置 ...

  5. linux sql命令行查询语句不要换行_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?...

    mysql执行一条sql查询语句背后发生了什么呢? 我是李福春,我在准备面试,今天的题目是: mysql的体系结构是怎样的?一条sql语句在mysql的体系结构中经历了什么? 答: mysql体系结构 ...

  6. MySQL InnoDB 存储引擎原理浅析

    前言 本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍<MySQL技术内幕++InnoDB存储引擎>,本文章仅记录个人认为比较重要的部分,有兴趣的可以花点时间读原书. 一.My ...

  7. wdcp php5.3 pdo_mysql,WDCP常用组件(memcache、mysqli、PDO_MYSQL、mysql innodb、libmcrypt、php zip)的安装方法...

    一般来说WDCP安装之后就可以正常使用了,不过对于一些朋友来说还无法满足,现在收集了有关WDCP常用组件,比如memcache.mysqli.PDO_MYSQL.mysql innodb.libmcr ...

  8. mysql回表_到底什么情况下mysql innodb会发生回表操作?

    谢邀 MySQL innodb的主键索引是簇集索引,也就是索引的叶子节点存的是整个单条记录的所有字段值,不是主键索引的就是非簇集索引,非簇集索引的叶子节点存的是主键字段的值.回表是什么意思?就是你执行 ...

  9. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

最新文章

  1. 密码太多记不住?SSO帮你轻松访问VDI及外部资源
  2. 如何解一元一次方程视频_七年级数学教学视频-小邵课堂
  3. go 同一个参数传入不同struct_struct的基本介绍-go篇
  4. 【python】openstack管理小工具(增删查改,批量ping)
  5. 分享一个好用的函数吧,将js中的对象转成url参数
  6. chromebook刷机_如何为不支持Chrome操作系统的网站欺骗Chromebook用户代理
  7. 静茹docker容器的几种方法_1-容器和docker基础知识
  8. Spring容器创建流程(3)对beanFactory设置
  9. java怎么看提示错误,Mabatis错误提示Parameter index out of range的处理方法
  10. Java虚拟机知识点【栈帧】
  11. ImportError: No module named MySQLdb
  12. java语言没有保留结构和联合,java选择题判断题题库.doc
  13. 云网融合:中国电信国际公司的海外野心
  14. Handler消息机制详解,另对于MessageQueue阻塞线程的详解
  15. Kali-linux-2020 sqli-labs环境配置(含网上最全Less-29在Kali上的配置)
  16. Excel 文件的扩展名 .xls 与 .xlsx 的区别
  17. 企业内部即时通讯系统项目总结
  18. 思维导图怎么画?简单易学的思维导图绘制教程
  19. 决策树模型——鸢尾花分类
  20. X的N次方求解——pow(x,n)实现

热门文章

  1. Lasagne 实现并测试MNIST
  2. Ubuntu中录屏软件、文档编写、Ubuntu中Codelite下载方法以及古月老师的编写的Ubuntu助手地址
  3. 使用js插件实现简单有趣的人脸识别
  4. dotty编译器语法特性之一幽灵类型
  5. requests+bs4+正则爬取前程无忧招聘信息进阶版
  6. 求质因数只能是2,3,5,7的第n大个数(丑数求解)
  7. 线束导通测试仪使用说明书
  8. 与内在功能连接个体变异性相关的基因表达
  9. 在线伪原创工具免费版
  10. 手把手教你开通百度慧推消息推送服务