1.MySQL-体系结构

一.MySQL体系架构

 

1、Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的(SQL Interface、Parser、Optimizer、Caches&Buffers、Pluggable Storage Engines)

第一层:客户端

  并不是MySQL独有的技术,它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等

(1) Connectors指的是不同语言中与SQL的交互 (并不是MySQL独有的技术,它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等)

第二层:SQL Layer。MySQL的核心部分

  这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。

(2)Management Serveices & Utilities: 系统管理和控制工具,例如备份恢复、Mysql复制、集群等 
(3)Connection Pool: 连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求 
(4)SQL Interface: SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface 
(5)Parser: 解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本, 主要功能: 
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 
(6)Optimizer: 查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。 
用一个例子就可以理解: select uid,name from user where gender = 1; 
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤 
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤 
将这两个查询条件联接起来生成最终查询结果

(7) Cache和Buffer(高速缓存区): 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。 
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。 
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 

第三层:存储引擎层

  通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事 物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求

(8)Engine :存储引擎。存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。 
Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎) 
现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB 
默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。 
InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。 
Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的 

一条SQL的执行过程

 MySQL是单进程,多线程

连接管理和安全

在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中。服务器缓存了线程,因此不需要为每个client连接单独创建和销毁线程 。

当clients(也就是应用程序)连接到了MySQL服务器。服务器需要对它进行认证(Authenticate)。认证是基于用户名,主机,以及密码。对于使用了SSL(安全套接字层)的连接,还使用了X.509证书。clients一连接上,服务器就验证它的权限 (如是否允许客户端可以查询world数据库下的Country表的数据)。

优化和执行

MySQL会解析查询,并创建了一个内部数据结构(解析树)。然后对其进行各种优化。这些优化包括了,查询语句的重写,读表的顺序,索引的选择等等。用户可以通过查询语句的关键词传递给优化器以便提示使用哪种优化方式,这样即影响了优化器的优化方式。另外,用户也可以请求服务器给出优化过程的各种说明,以获知服务器的优化策略,为用户提供了参数基准,以便用户可以重写查询,架构和修改相关服务器配置,便于mysql更高效的运行。

优化器并是不关心表使用了哪种存储引擎,但是存储引擎对服务器优化查询的方式是有影响的。优化器需要知道存储引擎的一些特性:具体操作的性能和开销方面的信息,以及表内数据的统计信息。例如,存储引擎支持哪些索引类型,这对于查询是非常有用的。

在解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据。如果请求一个查询在缓存 中存在,就不需要解析,优化和执行查询了。直接返回缓存中所存放的这个查询的结果。

二.MySQL内存结构

Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配。

实际上MySQL内存的组成和Oracle类似,也可以分为SGA(系统全局区)和PGA(程序缓存区)。

mysql>show variables like "%buffer%";

一、SGA

1.innodb_buffer_pool

用来缓存Innodb表的数据、索引、插入缓冲、自适应哈希索引,锁信息,数据字典等信息。

2.innodb_log_buffer

事务在内存中的缓冲,即red log buffer的大小

3.query cache

高速查询缓存,在生产环境中建议关闭。

4.key_buffer_size

用于MyISAM存储引擎,缓存MyISAM存储。

引擎表的索引文件(区别于innodb_buffer_poll数据和索引缓存)

5.innodb_additional_mem_pool_size

用来缓存数据字典信息和其它内部数据结构的内存池的大小。MySQL5.7.4中该参数取消。

二、PGA

1.sort_buffer_size(排序缓冲大小,提高排序效率)

主要用于SQL语句在内存中的临时排序

2.join_buffer_size

表连接使用,用于BKA,MySQL5.6之后开始支持。

3.read_buffer_size(顺序读缓冲大小,提高顺序都效率)

表顺序扫描的缓存,只能应用于MyISAM表存储引擎。

4.read_rnd_buffer_size(随机缓冲大小,提高随机都效率)

MySQL随机读缓冲区大小,用于做mrr,mrr是MySQL5.6之后才有的特性。

5.tmp_table_size

SQL语句在排序或分组时没有用到索引,就会使用临时表空间。

6.max_heap_table_size

管理heap,memory存储引擎表。


(1)innodb_buffer_pool_size:

(1.1) innodb高速缓冲data和索引,简称IBP,这个是Innodb引擎中影响性能最大的参数。建议将IBP设置的大一些,单实例下,建议设置为可用RAM的50%~80%。
(1.2)innodb不依赖OS,而是自己缓存了所有数据,包括索引数据、行数据等等,这个和myisam有差别。
(1.3)IBP有一块buffer用于插入缓冲,在插入时,先写入内存之后再合并后顺序写入磁盘;在合并到磁盘的时候会引发较大的IO操作,对实际操作造成影响。(看上去的表现是抖动,TPS变低)
(1.4)show global status like ‘innodb_buffer_pool_%’ 查看IBP状态,单位是page(16kb),其中,Innodb_buffer_pool_wait_free 如果较大,需要加大IBP设置
(1.5)InnoDB会定时(约每10秒)将脏页刷新到磁盘,默认每次刷新10页;要是脏页超过了指定数量(innodb_max_dirty_pages_pct),InnoDB则会每秒刷100页脏页
(1.6)innodb_buffer_pool_instances可以设置pool的数量
(1.7)show engine innodb status\G    可以查看innodb引擎状态
 

四.Innodb体系结构

猜你喜欢

转载自www.cnblogs.com/asea123/p/10076563.html