Mysql 体系结构 和 存储引擎

拥有回忆 提交于 2019-12-04 01:44:56

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

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

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

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

更加直白的解释:

数据库是由一个个文件组成(一般来说是二进制文件),如果要对这些文件执行诸如 select 、insert、update、delete 之类的操作,不能通过简单的操作文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。

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

由上图可以发现,mysql 由 以下几个部分组成:

连接池组件、管理服务 和 工具组件、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 缓冲池时,这个值 也会相应的增加。简单理解为:额外缓冲池用于管理缓冲池的内容的,所以缓冲池越大额外换池也需要越大;

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!