MySQL 体系结构和存储引擎
- MySQL 是一个可移植的数据库, 在Linux,Solaris, FreeBSD,Mac 和 Windows上运行
- MySQL 能保证在各个平台上的物理体系结构是一致的.
定义数据库和实例
数据库:物理操作系统文件或者其他形式文件类型的集合.
- 文件的集合(一般来说是二进制文件),是依照某种数据模型组织起来并且存放在二级存储器中的数据集合
- 在MySQL 数据库中,数据库文件可以是 frm,MYD,ibd 结尾的文件
- 在NDB 引擎中,数据库的文件可能不是存放在操作系统中,而是存放在内存中的文件.
数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;
数据库实例:数据库实例才是真正用于操作数据库文件的程序集.
- Mysql被设计成一个单进程多线程架构的数据库,所以在操作系统上表现就是一个进程。

- 数据库实例是程序,是位于用户和操作系统之间的一层数据管理软件,用户对数据库中的数据做任何的操作,包括数据定义、数据查询、数据维护、数据库运行控制等等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
- 一般情况下一个实例操作一个或多个数据库(Oracle一个实例对应一个数据库);集群情况下多个实例操作一个或多个数据库。
数据库实例读取配置文件:
- 启动实例时, MySQL 数据库会读取配置文件,根据配置文件的参数启动数据库实例.
- 读取顺序:/etc/my.cnf > /etc/mysql/my.cnf > /usr/etc/my.cnf > ~/.my.cnf
- 如果没有参数文件,MySQL 会按照编译时的默认参数设置启动实例,Oracle 数据库会启动失败
DataBase/instane/session
- 访问以及操作Database需要instance
- 与MySQL 连接成功建立一个session,session是和instance建立,每个session可以使用不同的用户身份
- 一个instance可以操纵多个database, 一个session和一个instance建立连接,既一个session可以操纵多个database.
计算机存储器
主存=内存 指计算机中的内存条;外存=辅存 如:硬盘、U盘、光盘及软盘等;
主存储器 /又称内存储器(简称内存):
- 内存又称主存,是CPU能直接寻址的存储空间,它的特点是存取速率快。内存是电脑中主要部件,它是相对于外存来说。
- 内存一般采用半导体存储单元,包括随机存储器(RAM)、只读存储器(ROM)和高级缓存(Cache)。
随机存储器(RAM):(Random Access Memory)我们不仅可以从中读取数据,而且还可以写入数据。但是机器电源关闭时,它存入的数据就会丢失。内存条(SIMM)就是把RAM集成块集中在一小块电路板上。 只读存储器(ROM):(Read Only Memory)它是把数据或程序永久保存在其中,不能更改,只能读取。即使机器断电,数据也不会丢失。 高级缓存(Cache):它是介于CPU与内存之间,常用有一级缓存(L1)、二级缓存(L2)、三级缓存(L3)(一般存在于Intel系列)。它的读写速度比内存还快,当CPU在内存中读取或写入数据时,数据会被保存在高级缓冲存储器中,当下次访问该数据时,CPU直接读取高级缓冲存储器,而不是更慢的内存。
辅助存储器/又称外存储器/又称二级存储器:
- 计算机主存储器或内存之外的所有可访问数据存储器,是程序和数据长期保存的地方,常见的二级存储设备有(固定/移动)硬盘、光盘、等
- 是指计算机用来存储数据和程序的各种存储介质。它是指除CPU缓存和计算机内存以外的存储器。
MySQL 体系结构

MySQL数据库引区别于其他数据库的特点:
插件式的表存储引擎, MySQL插件式的存储引擎结构提供了一些列标准的管理和服务支持,这些标准与存储引擎本身无关,是数据库系统本身需要的.
插件式体系结构是一种非常灵活的组件式结构,它把程序的功能分散在插件中来完成。插件是可独立开发的程序模块,它能够动态地插入到系统中,并且可以被自由地删除和替换。因此它能够提高软件开发的并行性和开发效率,降低设计开发难度,缩短开发周期,增强应用程序的可运行性、可测试性和可维护性.
MySQL 逻辑系统架构分为3层
应用层: 是MySQL体系架构的最上层,它可其他client-server架构一样,(客户端—>数据库服务端).
1. 连接处理: 当一个客户端向服务端发送连接请求后,MySQL server会从线程池中分配一个线程来和客户端进行连接,以后该客户端的请求都会被分配到该线程上。MySQL Server为了提高性能,提供了线程池,减少了创建线程和释放线程所花费的时间。
2. 用户鉴权: 当客户端向MySQL服务端发起连接请求后,MySQL server会对发起连接的用户进行鉴权处理,MySQL鉴权依据是: 用户名,客户端主机地址和用户密码
3. 安全管理 当客户连接到MySQL server后,MySQL server会根据用户的权限来判断用户具体可执行哪些操作。MySQL 提供的部分权限的如下:
服务层: 提供了MySQL Server数据库系统的所有逻辑功能.
- MySQL Management Server & utilities(系统管理): 丰富的数据库管理功能
- 数据库备份和恢复
- 数据库安全管理,如用户及权限管理
- 数据库复制管理
- 数据库集群管理
- 数据库分区,分库,分表管理
- 数据库元数据管理
- SQL Interface(SQL 接口)
- Data Manipulation Language (DML).
- Data Definition Language (DDL).
- 存储过程
- 视图
- 触发器
- SQL Parser(SQL 解析器)
作用主要是解析查询语句,最终生成语法树。首先解析器会对查询语句进行语法分析,如果语句语法有错误,则返回相应的错误信息。语法检查通过后,解析器会查询缓存,如果缓存中有对应的语句,就直接返回结果不进行接下来的优化执行操作。
- Optimizer (查询优化器)
优化器的作用主要是对查询语句进行优化,包括选择合适的索引,数据的读取方式。
- Caches & buffers(缓存)
包括全局和引擎特定的缓存,提高查询的效率。如果查询缓存中有命中的查询结果,则查询语句就可以从缓存中取数据,无须再通过解析和执行。这个缓存机制是由一系列小缓存组成,如表缓存、记录缓存、key缓存、权限缓存等。
存储引擎层:
1. 存储引擎 存储引擎是MySQL中具体与文件打交道的子系统,也是MySQL最有特色的地方。MySQL区别于其他数据库的最重要特点是其插件式的表存储引擎。他根据MySQL AB公司提供的文件访问层抽象接口来定制一种文件访问的机制(该机制叫存储引擎)。
2. 物理文件 物理文件包括:redolog、undolog、binlog、errorlog、querylog、slowlog、data、index等
MySQL 存储引擎
InnoDB 存储引擎

特点:
InnoDB 存储引擎支持事务,设计目的主要是面向在线事务处理(OLTP)的应用
oltp和olap是两种常见的业务模式:
- On line transaction processing 在线事务处理,比如常见的银行系统,特点:
- 实时性要求高
- 数据量小,并发量高
- 要求绝对的事务完整性
- olap(on line analytical processing) 在线分析处理,这种业务一般是日志的分析和深度挖掘,常见如淘宝的交易记录,百度地图的人口迁徙记录 具有以下特点,olap的结果一般是为决策提供支持
- 数据量通常非常大
- 对事务要求不高 通常只有 添加和查询操作
- 实时性要求不高通常只有汇总后的结果,而汇总分析过程通常可以执行很久
行锁设计、支持外键,以及类似orcal的非锁定读,即默认读取操作不会产生锁。

- 行锁:一锁锁定一行或者多行记录,Mysql的行锁是基于索引加载的,所以行锁是要加在索引响应上,即命中索引。
行锁特征:锁冲突概率低,并发性高,会有死锁的概率出现。
- 表锁:一锁锁定一张表,表格锁定其他事务不能对该表格进行操作,表锁响应的是非索引字段,即全表扫描
表锁特征:由于表锁每次都是锁一整张表,所以表锁的锁冲突几率特别高,表锁不会出现死锁的情况。
- Mysql可以将灭个InnoDB存储索引的表单独放到一个独立的ibd文件中
- InnoDB引擎支持用裸设备(row disk)建立表空间
- InnoDB 通过使用多版本并发控制(MVCC)获得高并发性,并且实现SQL标准的四种隔离级别,默认为REPEATABLE级别。
- 使用next-key locking的策略来避免幻读(phantom)
- InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读等高性能和高可用的功能
表中的数据,innoDB采用了聚集的方式, 因此每张表的存储都是按照主键的顺序进行存放,如果表格没有显示的在表定义的时候指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID作为主键。
MyISAM 存储引擎
特征:
不支持事务、表锁设计,支持全文索引,主要面对OLAP数据库应用。
MyISAM 存储引擎的缓冲池只缓冲索引文件,不缓冲数据文件
NDB 存储引擎
特点: 高可用/高性能
NDB 引擎是一个集群引擎,类似于Oracle的RAC集群,不过于RAC sharing everything架构不同的是,结构是sharing nothing的集群架构.
- NDB的数据全部存放在内存中,因此主键查找的速度非常快,并且可以通过添加NDB数据存储节点可以线性提高数据库性能
NDB存储引擎的连接操作(JOIN)是在MySQL 数据层完成的,不是自存储引擎层完成,所以执行连接操作时网络开销巨大,查询速度很慢.
Memory 存储引擎
特點:
Memory存儲引擎(之前称HEAP存儲引擎),表中数据存放在内存中
(缺点: 数据库发生重启或者崩溃,表中的数据会消失)
- 适用于存储临时数据的数据表,以及数据仓库中的维度表
- 事实表: 事实表(Fact Table)是指存储有事实记录的表,如系统日志、销售记录等;事实表的记录在不断地动态增长,所以它的体积通常远大于其他表。
- 事实表作为数据仓库建模的核心,需要根据业务过程来设计,包含了引用的维度和业务过程有关的度量。
- 维度表(Dimension Table)或维表: 有时也称查找表(Lookup Table),是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关联;相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。常见的维度表有:日期表(存储与日期对应的周、月、季度等的属性)、地点表(包含国家、省/州、城市等属性)等。
Archive 存储引擎
特点:
- 只支持INSERT和SELECT操作,运用zlib算法将数据行进行压缩存储,压缩比可高达1:10,适合存储归档数据(eg:日志信息)。
- Archive存储使用行锁实现高并发的插入操作,本身并不是事务安全的存储引擎,设计目标是提供高速的插入和压缩功能。
Federated 存储引擎
特点:
- 不存储数据,只是指向远程MySQL数据库服务器上的表。(类似于SQL Server的链接服务和Oracle的透明网关)
-
Maria 存储引擎
特点:
新开发的引擎,设计目标是用来取代原有的MyISAM存储引擎,成为MySQL默认存储引擎。
- 支持存储缓存数据和索引文件,应用了行锁设计,提供了MVCC功能
- 支持事务和非实物安全的选项,以及更好的BLOB字符类型的处理性能。
其他存储引擎
QA
- MySQL 支持全文索引,MyISAM、InnoDB和Sphinx引擎存储都支持全文索引。
- MySQL的MyISAM存储引擎不支持事务,但是InnoDB支持。
- 对于ETL 操作,MyISAM有优势,在OLTP环境中,InnoDB存储引擎效率更好。
- 数据量变大,MySQL性能会急剧下降:×
比较运行不同的存储引擎之后,表的大小:
MyISAM—>table size: 40.7MB; InnoDB—>113.6MB; Archive—>20.2MB;
示例数据库:
SQL SERVER —>AdventureWorks;
Oracle/MySQL —> 示例数据库;
连接MySQL
连接MySQL操作是一个连接进程和MySQL数据库实例进行通信,MySQL数据库提供的连接方式本质上是进程通信。
(常见的进程通讯:管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字)
TCP/IP
TCP/IP套接字 :
- MySQL数据库在任何平台下都提供的连接方式。
- 网络中使用最多的一种方式
- 在TCP/IP连接上建立一种基于网络的连接请求
- 一般情况下客户端(client)在一台服务器上,MySQL 实例(server)在另一台服务器上,两台机器通过一个TCP/IP网络连接。
- 用户在Windows服务器下请求一台远程Linux服务器下的MySQL实例。
host ip:192.168.0.101 user:david
eg: C:>mysql -h192.168.0.101 -u david -p
- 在通过TCP/IP 连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySQL实例。
eg:mysql> use mysql;
mysql>select host,user,password from user;
命名管道和共享内存
命名管道的连接方式:如果两个需要通信的进程在同一台服务器上,可以使用命名管道。
- (SQL SERVER 数据库安装后的本地连接也是使用命名管道。)
- 在MySQL数据库中必须在配置文件中启用 —enable-named-pipe
共享内存的连接方式:
- 在配置文件中添加,—shared-memory。
连接时,MySQL客户端必须使用 —protocal=memory
UNIX 域套接字
不是一个网络协议
- 只能MySQL客户端和数据库实例在同一台服务器上才可以使用
- 套接字连接:
- 查找 套接字文件 的路径:
- 配置文件中指定套接字文件的路径, —socket=/tmp/mysql.sock
- 启动MySQL实例,命令查找套接字路径:
- mysql>SHOW VARIABLES LIKE ‘socket’
- 连接 套接字文件
- mysql -udavid -S /temp/mysql.sock
- 查找 套接字文件 的路径:
[
](https://blog.csdn.net/wangyijie521/article/details/82146997)

