mysql 数据库的逻辑架构以下图mysql
mysql 的逻辑的逻辑架构大致分为四层:链接层、服务层、引擎层、存储层。下面咱们就来一一介绍这四层。sql
最上层是一些客户端和链接服务,包含本地socket通讯和大多数基于客户端/服务端工具实现的相似于tcp/ip的通讯。数据库
主要完成一些相似于链接处理、受权认证、及相关的安全方案。在该层上引入了线程池的概念,为经过认证安全接入的客户端提供线程。一样在该层上能够实现基于SSL的安全连接。服务器也会为安全接入的每一个客户端验证它所具备的操做权限。缓存
当MySQL启动(MySQL服务器就是一个进程),等待客户端链接,每个客户端链接请求,服务器都会新建一个线程处理(若是是线程池的话,则是分配一个空的线程),每一个线程独立,拥有各自的内存处理空间,可是,若是这个请求只是查询,不要紧,可是如果修改数据,很显然,当两个线程修改同一块内存是会引起数据同步问题的。安全
服务层负责解析查询(编译SQL),并对其进行优化(如调整表的读取顺序,选择合适的索引等)。对于SELECT语句,在解析查询前,服务器会先检查查询缓存,若是能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现。服务器
存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器经过API与存储引擎进行通讯。不一样的存储引擎具备的功能不一样,这样咱们能够根据本身的实际须要进行选取。后面介绍MyISAM和InnoDB数据结构
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。架构
虽然从上图看起来 MySQL 架构很是的简单,就是简单的几部分而已,但实际上每一层中都含有各自的不少小模块,尤为是第二层服务层,结构至关复杂的。下面咱们就分别针对服务层和引擎层作一个简单的分析。咱们看下图体系结构:并发
1.Connectorssocket
指的是不一样语言中与SQL的交互。
2.Management Serveices & Utilities:
系统管理和控制工具
3.Connection Pool
管理缓冲用户链接,线程处理等须要缓存的需求。
4.SQL Interface
接受用户的SQL命令,而且返回用户须要查询的结果。好比select from就是调用SQL Interface。
5 Parser
SQL命令传递到解析器的时候会被解析器验证和解析。
解析查询,建立一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析
6 Optimizer
优化SQL语句,例如重写查询,决定表的读取顺序,以及选择须要的索引等。这一阶段用户是能够查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,好比某个操做的开销信息、是否对特定索引有查询优化等。
7 Cache、Buffer
它的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中。该 query 所取数据的基表发生任何数据的变化以后, MySQL 会自动使该 query 的Cache 失效。在读写比例很是高的应用系统中, Query Cache 对性能的提升是很是显著的。固然它对内存的消耗也是很是大的。若是查询缓存有命中的查询结果,查询语句就能够直接去查询缓存中取数据。
8 、Pluggable Storage Engines
存储引擎是数据库管理系统用来从数据库建立、读取和更新数据的软件模块。
注意:存储引擎是基于表的,而不是数据库。
mysql的查询流程大体是:
1)mysql客户端经过协议与mysql服务器建链接,发送查询语句,先检查查询缓存,若是命中,直接返回结果,不然进行语句解析,也就是说,在解析查询以前,服务器会先访问查询缓存(query cache)——它存储SELECT语句以及相应的查询结果集。
2)语法解析器和预处理:首先mysql经过关键字将SQL语句进行解析,并生成一颗对应的“解析树”。
3)查询优化器当解析树被认为是合法的了,而且由优化器将其转化成执行计划。一条查询能够有不少种执行方式,最后都返回相同的结果。优化器的做用就是找到这其中最好的执行计划。
4)而后,mysql默认使用的BTREE索引,而且一个大体方向是:不管怎么折腾sql,至少在目前来讲,mysql最多只用到表中的一个索引。
如上图所示,mysql 中包含了许多不一样的存储引擎。在这里咱们主要介绍两个比较经常使用的存储引擎:MyISAM和InnoDB。
在5.5版本以前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,因此使用场景比较少,主要特色为:
(1)不支持事务;
(2)不支持外键,若是强行增长外键,不会提示错误,只是外键不其做用;
(3)对数据的查询缓存只会缓存索引,不会像InnoDB同样缓存数据,并且是利用操做系统自己的缓存;
(4)默认的锁粒度为表级锁,因此并发度不好,加锁快,锁冲突较少,因此不太容易发生死锁;
(5)支持全文索引(MySQL5.6以后,InnoDB存储引擎也对全文索引作了支持),可是MySQL的全文索引基本不会使用,对于全文索引,如今有其余成熟的解决方案,好比:ElasticSearch,Solr,Sphinx等。
(6)数据库所在主机若是宕机,MyISAM的数据文件容易损坏,并且难恢复;
从MySQL5.5版本以后,MySQL的默认内置存储引擎已是InnoDB了,他的主要特色有:
(1)灾难恢复性比较好;
(2)支持事务。默认的事务隔离级别为可重复读,经过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,能够支持更高的并发;
(4)支持外键;
(5)配合一些热备工具能够支持在线热备份;
(6)在InnoDB中存在着缓冲管理,经过缓冲池,将索引和数据所有缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。全部的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
(8)InnoDB表的文件存储分为独立表空间和系统表空间,默认使用的是系统表空间
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
锁的粒度 | 表锁 | 行锁 |
缓存 | 只缓存索引,不缓存真实数据 | 不只缓存索引还要缓存真实数据,对内存要求较高。 |
关注点 | 节省资源、消耗少、简单业务 | 并发写、事务、更大资源 |
查询性能 | 高 | 低,由于须要维护数据册缓存 |