MySQL数据库中的架构之内存架构

Posted 一腔热血1007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库中的架构之内存架构相关的知识,希望对你有一定的参考价值。

        mysql5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。

        内存结构中,主要分为这么四大块儿: Buffer PoolChange BufferAdaptive Hash Index、Log Buffer。 接下来介绍一下这四个部分。

1). Buffer Pool

        InnoDB存储引擎基于磁盘文件存储,访问物理硬盘和在内存中进行访问,速度相差很大,为了尽可能 弥补这两者之间的I/O效率的差值,就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁盘I/O

        在InnoDB的缓冲池中不仅缓存了索引页和数据页,还包含了undo页、插入缓存、自适应哈希索引以及InnoDB的锁信息等等。

        缓冲池 Buffer Pool,是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。

        缓冲池以Page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型:

        • free page:空闲page,未被使用。

        • clean page:被使用page,数据没有被修改过。

        • dirty page:脏页,被使用 page ,数据被修改过,也中数据与磁盘的数据产生了不一致。          在专用服务器上,通常将多达 80 %的物理内存分配给缓冲池 。参数设置: show variables like 'innodb_buffer_pool_size';

2). Change Buffer

         Change Buffer ,更改缓冲区(针对于非唯一二级索引页),在执行 DML 语句时,如果这些数据 Page 没有在 Buffer Pool 中,不会直接操作磁盘,而会将数据变更存在更改缓冲区 Change Buffer 中,在未来数据被读取时,再将数据合并恢复到 Buffer Pool 中,再将合并后的数据刷新到磁盘中。                  Change Buffer的意义是什么呢?         与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新 可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO。有了ChangeBuffer之后,我们可以在缓冲池中进行合并处理,减少磁盘 IO         

3). Adaptive Hash Index

         自适应 hash 索引,用于优化对 Buffer Pool 数据的查询。 MySQL innoDB 引擎中虽然没有直接支持 hash 索引,但是给我们提供了一个功能就是这个自适应 hash 索引。因为前面我们讲到过, hash 索引在 进行等值匹配时,一般性能是要高于 B+ 树的,因为 hash 索引一般只需要一次 IO 即可,而 B+ 树,可能需 要几次匹配,所以 hash 索引的效率要高,但是 hash 索引又不适合做范围查询、模糊匹配等。          InnoDB 存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下 hash 索引可以提升速度, 则建立 hash 索引,称之为自适应 hash 索引。          自适应哈希索引,无需人工干预,是系统根据情况自动完成。          参数: adaptive_hash_index

4). Log Buffer

         Log Buffer :日志缓冲区,用来保存要写入到磁盘中的 log 日志数据( redo log undo log ), 默认大小为 16MB ,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O          参数:   innodb_log_buffer_size :缓冲区大小         innodb_flush_log_at_trx_commit :日志刷新到磁盘时机,取值主要包含以下三个:         1: 日志在每次事务提交时写入并刷新到磁盘,默认值。          0: 每秒将日志写入并刷新到磁盘一次。         2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

MySQL体系架构

MySQL体系架构

学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它。

数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm、myd、myi、ibd等结尾的文件,当使用NDB存储引擎时候,不是os文件,是存放于内存中的文件。

数据库实例:由数据库后台进程/线程以及一个共享内存区组成,共享内存可以被运行的后台进程/线程所共享。

连接者:不同语言的代码程序和mysql的交互(SQL交互)

1、连接池 管理、缓冲用户的连接,线程处理等需要缓存的需求

   为解决资源的频繁分配﹑释放所造成的问题,为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

   进行身份验证、线程重用,连接限制,检查内存,数据缓存;管理用户的连接,线程处理等需要缓存的需求

2、管理服务和工具组件 系统管理和控制工具

   从备份和恢复的安全性、复制、集群、管理、配置、迁移和元数据等方面管理数据库

3、sql接口 接受用户的SQL命令,并且返回用户需要查询的结果

   进行DML、DDL,存储过程、视图、触发器等操作和管理;用户SQL命令接口

4、查询解析器 SQL命令传递到解析器的时候会被解析器验证和解析(权限、语法结构) 

   SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本, 主要功能: 
   a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 
   b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 

5、查询优化器 SQL语句在查询之前会使用查询优化器对查询进行优化

   select id,name from user where age = 40; 
   a、这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行age过滤 
   b、这个select查询先根据id和name进行属性投影,而不是将属性全部取出以后再进行过滤 
   c、将这两个查询条件联接起来生成最终查询结果

6、缓存 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据

    由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

7、插入式存储引擎 存储引擎说白了就是如何管理操作数据(存储数据、如何更新、查询数据等)的一种方法。因为在关系数据库 中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

说明: 

在Oracle 和SQL Server等数据库中,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。

 

以上是关于MySQL数据库中的架构之内存架构的主要内容,如果未能解决你的问题,请参考以下文章

深度优化LNMP之MySQL

MySQL体系架构

MySql-体系结构以及各种文件类型

LNMP架构搭建Discuz论坛(实战!)

三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构

使用MHA对mysql主从架构中的主节点做高可用