Mysql 体系结构 和 存储引擎

前言:数据库的引擎是整个mysql数据库的核心组件,mysql的存储引擎众多,MyISAM、InnoDB、Memory、Archive等,其中InnoDB是mysql里面支持事务类型的一个存储引擎最好的一个,雅虎、facebook、youtube、淘宝、谷歌用的mysql数据库都有用到InnoDB的存储引擎; mysql

在数据库领域中有2个词很容易混淆,“实例”  和 “数据库”;算法

数据库:物理操做系统文件或其余形式文件类型的集合;在mysql 中,数据库能够是 frm、myd、myi、ibd 结尾的文件。当使用 NDB引擎时,数据库的文件 可能 不是操做系统上的 文件,而是 存放于内存之中的文件,可是定义仍然不变。sql

数据库实例:由数据库后台进程/线程以及一个共享内存区组成,共享内存能够被运行的后台进程/线程所共享,须要牢记的是,数据库实例才是 真正用来操做数据库文件的。数据库

更加直白的解释:windows

数据库是由一个个文件组成(通常来讲是二进制文件),若是要对这些文件执行诸如 select 、insert、update、delete 之类的操做,不能经过简单的操做文件来更改数据库的内容,须要经过数据库实例来完成对数据库的操做。缓存

在mysql 中,实例和数据库的 一般关系是一 一 对应,即一个实例对应一个数据库,一个数据库对应一个实例.在集群状况下,可能存在一个数据库被多个实例使用的状况.数据结构

由上图能够发现,mysql 由 如下几个部分组成:oracle

链接池组件、管理服务 和 工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件。工具

注意:存储引擎是 基于 表的,而不是基于数据库的;存储引擎是 myql 区别于其余数据库的一个最重要的特性。存储引擎的好处是,每一个存储引擎都有各自的特色,可以根据具体的应用 创建不一样的 存储 引擎表,mysql 的 核心就是 存储引擎。优化

InnoDB 存储引擎

InnoDB 存储引擎 支持事务,主要面向在线事务处理方面的应用。其特色是 行锁设计、支持外键,并支持相似与 oracle 的 非锁定读,即默认状况下,读取操做不会产生锁。mysql 在 windows 版本下的 InnoDB 是默认的存储引擎,同时,InnoDB 默认的被包含在全部 Mysql 二进制发布版本中。

MyISAM 存储引擎

MyISAM 存储引擎是 mysql 官方提供的 存储引擎,特色是 不支持事务、表锁 和 全文索引,对于一些在线分析处理操做速度快,除了 windows 版本外,是全部 Mysql 版本 默认的 存储引擎。

查看使用的 mysql 所涵盖的 存储引擎命令: show engines\G;

改变 某个表的 存储引擎 命令:alter table mytest engine=innodb;

InnoDB 存储引擎 体系结构

InnoDB内存数据对象:数据页(undo page)、索引页(index page)、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、锁信息(lock info)、数据字典信息(data dictionary)、重作日志缓冲(redo log_buffer)、额外内存池(innodb_additional_mem_pool_size)。

 innodb的内存的做用大体以下:

  • 缓存磁盘上的数据,方便快速的读取;
  • 对磁盘文件的数据进行修改以前在这里缓存;
  • 应用所做的日志的缓存;
  • 内存结构自身的管理结构;

内存结构根据功能能够分红三部分:Innodb buffer pooladditional buffer poollog buffer;

Innodb buffer pool:缓冲池,从图上能够看到buffer pool占用最大块的内存部分,主要用来各类数据的缓冲。innodb将数据文件按页(16K)读取到缓冲池,而后按最少使用(LRU)算法来保留缓存数据;数据文件修改时,先修改缓存池中的页(即脏页),而后按必定平率将脏页刷新到文件;

查看mysql 内存的 分配状况:

mysql> show variables like 'innodb_%_size';
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| innodb_additional_mem_pool_size | 3145728   |
| innodb_buffer_pool_size         | 112197632 |
| innodb_log_buffer_size          | 2097152   |
| innodb_log_file_size            | 56623104  |
| innodb_purge_batch_size         | 20        |
+---------------------------------+-----------+
innodb_additional_mem_pool_size  的 大小:3145728/1024/1024 = 3 M

innodb_buffer_pool_size    的大小:112197632 /1024/1024 = 107M

innodb_log_buffer_size  的大小:  2097152 /1024/1024 = 2M

查看 innodb_buffer_pool 的运行使用状况:
mysql> show engine innodb status\G;

=====================================
161014 10:00:09 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 7 seconds  # 表示过去 7秒内的数据库的状态.

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 1
Dictionary memory alloca
Buffer pool size   6848
Free buffers       6414
Database pages     433
Old database pages 0
Modified db pages  0

从 上面能够看到 innodb 存储引擎缓冲池的使用状况.Buffer pool size 代表了一共有多少个缓冲帧(buffer frame),每一个buffer frame 为 16K,因此,这里一共分配了
6848 * 16/1024 = 107 M 的内存缓冲池. free buffers:当前空闲的缓冲帧; Database pages:表示已经使用的缓冲帧.Modified db pages:表示脏页的数量.

Log Buffer:日志缓冲池(功能跟oracle redo log buffer基本类似),将重作日志信息放入这个缓冲区,而后按必定频率将其刷新到重作日志文件。该值通常不须要设置很大,由于通常状况下每一秒钟就会将重作日志缓冲刷新到日志文件,所以咱们只须要保证每秒产生的事务量在这个缓冲大小以内便可;

脚本: show variables like ' innodb_log_buffer_size ';   能够显示log buffer的大小;

additional buffer pool:额外缓冲池,在对一些数据结构自己分配内存时,须要从额外的内存池中申请,当该区域的内存不够用时,会从缓冲池中申请。InnoDB 实例会申请缓冲池(innodb_buffer_pool) 的空间,
可是每一个缓冲池中的缓冲帧(frame buffer) 还有对应的缓冲控制对象(buffer control block),并且这些对象记录了诸如 LRU、锁、等待等方面的信息,而这个对象的内存须要从额外的内存池中申请。
所以,申请了很大的 InnoDB 缓冲池时,这个值 也会相应的增长。简单理解为:额外缓冲池用于管理缓冲池的内容的,因此缓冲池越大额外换池也须要越大;

相关文章
相关标签/搜索