1.MYSQL & InnoDB体系结构

来源:互联网 发布:淘宝活动策划方案 编辑:程序博客网 时间:2024/06/05 05:53

mysql介绍

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

mysql结构图

这里写图片描述

可以看到mysql server主要由以下部分组成

  • 连接池
  • 管理服务和工具组件
  • sql接口组件
  • 查询分析器
  • 优化器组件
  • 缓冲组件
  • 可插拔的各种存储引擎
  • 物理文件

    MYSQL与其他数据库最大的差别就是插件式的各种存储引擎,其他组件其他数据库基本都有,不是本文重点。

    MYSQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,每个存储引擎开发者都可以按照自己的意愿开发。通过mysql建表语句可以发现存储引擎是基于表的,而不是数据库。如:

CREATE TABLE `NewTable` (`a`  int NULL )ENGINE=InnoDB;

mysql丰富的存储引擎

mysql各种不同的存储引擎都有各自的特点,可以根据具体需求进行选择,由于mysql的开源特性,市面上也有很多的非官方开源存储引擎。
部分存储引擎列表:

  • InnoDB 支持事务,其设计的主要目的是面向在线事务处理应用
  • MyISAM 不支持事务,根据表锁设计,支持全文索引。
  • NDB 集群存储引擎
  • Memory 内存存储引擎,速度非常快,只支持表锁
  • Archive 只支持insert 和select,使用zlib压缩数据,非常适合记录日志
  • 还有其他各种各样的存储引擎。。。。

    其中支持事务的InnoDB存储引擎为使用最多的存储引擎。

InnoDB存储引擎结构

这里写图片描述

InnoDB主要由三大块组成:后台线程、内存池、文件。

  • 后台线程 负责刷新缓冲数据到磁盘,回收资源等各种数据库背后的工作。
  • 内存池 缓冲数据,用以提升数据库性能。
  • 文件 持久化数据库数据,保证数据不会丢失

InnoDB内存池结构

这里写图片描述

InnoDB是基于磁盘的存储引擎,并将其中记录按页的方式进行管理,可以视作是一个基于磁盘的数据库系统。但是由于磁盘的读写速度,尤其是机械硬盘的随机读写速度达不到用户需求,因此使用缓冲池技术来提高数据库整体性能。当从数据库中读取页的时候,首先从磁盘读取页放入缓冲池,当下次读取相同页时,判断是否还在缓冲池中,命中该页则不读取磁盘写入数据库页时,先修改在缓冲池中的页,然后以一定的规则和频率刷新到磁盘上。

其中:

  • 数据页 InnoDB是使用聚集索引存放记录的,所以数据页中包含主键索引和数据记录。
  • 索引页 存放辅助索引数据
  • 插入缓冲 对于非唯一辅助索引的插入和更新,不是每一次都插入到索引页中,而是先插入缓冲池,然后再以一定频率刷新到非聚集索引上。减少数据库随机io写入
  • 自适应哈希索引 InnoDB会监控表上索引页的查询,如果观测到建立hash索引可以带来速度提升就会建立hash索引,所以称为自适应hash索引。不能人为创建
  • 锁信息 innodb引擎锁资源信息存放
  • 重做日志缓冲 缓冲InnoDB事务产生的日志,以一定频率将其刷新到重做日志文件中。在提交事务时也会刷新到磁盘。

从这里已经看到了InnoDB内存池的结构,以及各部分的作用,但是对于InnoDB怎么使用内存池的呢?

InnoDB内存管理 LRUList FreeList

InnoDB缓冲池是一个很大的内存区域,其中存放了各种类型的数据。默认的缓冲池页大小为16k,InnoDB使用LRU(Latest Recent Used 最近最少使用)算法来管理内存池,最频繁使用的页在LRU列表的前端,最少使用的页在LRU列表的尾端,当缓冲池不能存放新读取到的页时,首先释放LRU尾端的页。InnoDB LRU算法有一些优化,在列表中加入了midpoint,最新冲磁盘读取到的页并不是放入首部,而是放入midpoint位置。可用过innodb_old_blocks_pct控制,防止某些操作会将缓冲池中所有的页刷出,可以根据应用的热数据量来确定midpoint的位置。当数据刚启动时,LRUList为空,此时页都存放在FreeList中,当需要从缓冲池中分配页时,先在FreeList中查看是否有空闲页。否则根据LRU算法淘汰LRU列表尾部的页,将该页分配给新的页

后台线程

InnoDB后台线程主要由master 线程 、io线程、purge线程组成。其中master线程工作最多。
+ MasterThread InnoDB核心后台线程,负责缓冲池数据异步刷新到磁盘、保证数据一致性、脏页刷新、合并插入缓冲、undo页回收等。
+ IOThread InnoDB大量使用AIO来处理IO请求,IOThread主要负责这些IO请求的回调处理
+ PurgeThread 回收undo页

InnoDB文件

表空间文件

InnoDB将存储的数据按表空间进行存放,默认配置会有一个初始大小10MB,名为ibdata1的文件,可设置多个文件组成一个表空间
若设置了innodb_file_per_table则每个基于InnoDB的表产生一个独立的表空间,命名为:表名.idb,而不用将所有数据都存放在默认的表空间中。idb文件中存放该表的数据、索引、插入缓冲BITMAP等。其余信息还是存放在共享表空间中。
这里写图片描述

重做日志

redo log file是InnoDB存储引擎的事务日志。当数据库挂掉的时候,InnoDB会根据重做日志恢复到挂到之前的时刻,来保证数据的完整性。

原创粉丝点击