MySQL 一.体系结构和存储引擎
MySQL 被设计成一个可以移植的数据库,可以在几乎所有主流的操作系统上运行,如Windows,Linux,MacOS,FreeBSD;其内部底层的实现方式因为操作系统的不同而有不同的实现,但是保证了在各个平台的物理体系结构一致性。怎么理解这个物理体系结构呢?,就是说很多概念性的东西都是有的,就是底层的实现方式不一致;比如数据库文件袋额存储结构,线程的配置,内存的配置等。
1.1 数据库和实例
数据库:物理操作文件的集合,一般常用的文件后缀是ibd,frm,myd,myi 等;在或者是ndb的引擎保存在内存的数据库文件,也是属于数据库;
实例:MySQL数据库实例是有后台线程和内存组成,内存被后台进程共享;操作数据库文件的是数据库实例(后台线程)
MySQL设计成是一个单进程多线程的程序;数据库和实例通常是一对一的关系,但是在集群的情况下可能是多个实例对应一个数据库;
MySQL在OS里面看到的就是一个进程;
MySQL实例启动的时候,回去根据配置文件去加载配置一般linux文件位置(可能是多个)是/etc/my.cnf
windows 的目录是安装目录下的my.ini
;其中一个配置熟悉为
datadir = /home/mysql/data
这个就是数据库(指的是数据库文件)所在的目录;
1.2 数据库的结构体系
用户对数据库的所有操作都是通过数据库实例来进行的;ACID不只是对数据库文件的修改,是需要实例来进行的;下面是MySQL 的架构实现
可以看见,大概有以下几个模块;
- 连接池组件:连接池组件,管理和缓冲所有的数据库连接
- 管理服务和工具 :系统管理和控制
- SQL接口组件:接收用户SQL命令,返回sql 处理后的结果
- 查询分析器组件:到分析器会被验证和解析 ,实现是有Lex 和YACC实现 ,主要功能是吧SQL 语句分解成数据结构,后续的处理就是基于这个结构,分析报错的话,就说明这个SQL是不合理的;
- 优化器组件:SQL查询之前会使用查询优化器,使用 选取-投影-策略 查询
- 缓存组件 Cache&Buffer:缓冲里面有查询的数据就直接那缓存区的数据
- 插件式存储引擎:特色功能之一,不同的表可以使用不同的存储引擎
- 文件系统 :屏蔽底层硬件的功能 对不同的硬件或者系统 写入的文件格式是一致的
MySQL区别与其他服务器是其独有的插件式的表存储引擎;开发者可以自定义自己的存储引擎;注意存储引擎是基于表的,而不是数据库的。
1.3 MySQL 存储引擎
MySQL 的特色是其不同的存储引擎,存储引擎的不同对应于不同的使用场景,对于开发者来说,我们应该深刻的理解到MySQL的核心就在于存储引擎;
1.3.1 InnoDB
支持事务,设计目标就是在线事务处理 online transation process OLTP;行锁设计,支持外键;5.5.8后 是MySQL默认使用的存储引擎;每个表的数据存储一个逻辑的表空间中,对应的一个ibd ;
InnoDB 通过多版本并发控制 multi version concurrency control (MVCC) ,并且实现了SQL 的标准的4种隔离级别;MySQL的默认管理级别是REPEATABLE.同时,使用一种被称为next-key locking 的方式来避免幻读的产生,还使用了BUFFER POOL 来加速读写 ,其中的核心功能insert buffer插入缓冲,double write 二次写 adaptive hash index 自适应哈希索引 read ahead预读;
表数据的存储采用了聚集 (clustered) 的方式,数据都是按照主键的顺序存储,如果没有主键的时候,会默认的生成一个6字节的ROWID 来作为主键存储
1.3.2 MyISAM 存储引擎
不支持事务
表锁设计(锁的粒度大)
5.5.8 以前是默认的存储引擎; 该引擎的缓冲池只缓存(cache)索引文件,对于数据文件不缓存;
MyISAM引擎的表是由MYD (数据文件)和MYI(索引文件)组成;至于为什么要分成两个文件,可能是因为他的设计只cache 索引文件
注:在缓存池中的索引文件的缓冲区大小最大为4GB
1.3.3 NDB存储引擎
集群存储引擎;添加节点可以线性的提高性能;是一个高性能,高可用的集群系统;
数据全部存在于内存中,5.1后可以把非索引数据放到磁盘上,主键查询非常快
缺点:数据的join 会通过MySQL 数据库再去查询 走了网络,不是引擎层去关联,比较慢
1.3.4 Memory存储引擎
也叫HEAP 存储引擎;数据存储在内存中,机器重启 软件崩溃都会导致数据缺失
使用场景:储存临时数据,默认使用的索引是hash 索引不是B+数索引
表锁设计,不支持TEXT ,BLOB ,varchar 按照char 存储 消费了更多的内存数据
1.3.5 Archive
只支持insert /select 的操作 5.1 后开始支持索引 使用zlib 压缩算法压缩数据,压缩比1:10 ,适合存储日志文件;
设计目标:高速的数据插入功能和压缩功能
1.4 存储引擎比较
不同的引擎具有不同的性能(存储容量,事务支持,锁的粒度,MVCC,索引支持,备份和复制等),使用的场景,针对适合的场景才能发挥出使用价值;
show engines 可以看到当前MySQL 数据库支持的存储引擎,也可以通过表information_schema.engines 表查询
select * from information_schema.engines
show engines;
Engine | Support | Comment | Transactions | XA | Savepoints |
---|---|---|---|---|---|
InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
MyISAM | YES | MyISAM storage engine | NO | NO | NO |
CSV | YES | CSV storage engine | NO | NO | NO |
ARCHIVE | YES | Archive storage engine | NO | NO | NO |
PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
不同的存储引擎对应存储数据后的文件格式是不一样的,同样文件的大小也是不一致的;
1.5 MySQL连接
连接的本质就是通信
.TCP/IP
套接字方式是MySQL数据库在任何平台下都提供的连接方式,也就是说。只要有网络连接到MySQL的服务器 就可以和数据库进行下一步操作