通过前面几篇文章学会如何安装 MySQL 以及基础知识后,我们还需要学习体系结构,MySQL 和 Oracle 体系结构类似,如果学过 Oracle 可以类比记忆,基础牢固才能学好数据库,才能做一个合格的 DBA,下面一起来看看。
MySQL 体系结构可分为两层,MySQL Server 层和 存储引擎层,而 MySQL Server 层又分为连接层和 SQL 层,连接层包括通信协议、线程处理、用户名密码认证,SQL 层包含权限判断、查询缓存、解析器、预处理器、查询优化器、缓存和执行计划。存储引擎主要有InnoDB、MyISAM、Memory、blackhole、TokuDB 和 MariaDB columnstore 等。详细的功能信息请看下文。
MySQL 体系结构
1、Connectors
指的是不同语言的应用程序接口(如JDBC、ODBC、Python等)与 MySQL 的连接交互层;
2、Management Serveices &Utilities
系统管理和控制工具,例如备份恢复、MySQL 复制、集群等;
3、Connection Pool
连接池,管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的信息; MySQL 服务器对每一个连接产生一个线程,而这个线程独自为该连接服务。因此,MySQL 服务器中的并行是指并行执行许多个查询而非一次查询内的并行。也由此原因致使 MySQL 对多核支持不够好,MySQL 服务器是一组线程的集合。
4、SQL Interface
SQL 接口,接受用户的 SQL 命令,并且返回用户需要查询的结果。比如 DML 就是调用 SQL Interface;
5、Parser
解析器,SQL 命令传递到解析器的时候会被解析器验证和解析。解析器是由 Lex 和 YACC 实现的,是一个很长的脚本;
主要功能:
l 将 SQL 语句分解成数据结构,并将这个结构传递到后续步骤,以后 SQL 语句的传递和处理就是基于这个结构的;
l 如果在分解构成中遇到错误,那么就说明这个 SQL 语句是不合理的 ;
l Lex:Lexical Analyzer 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序;
l Yacc:Yet Another Compiler Compiler 是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语法解析器;
6、Optimizer
查询优化器,SQL 语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询;
优化 select uid,name from user where gender = 1;
SQL语句执行的过程如下:
l 这个 select 查询先根据 where 语句进行记录选取,而不是先将表全部记录查询出来以后再进行 gender 过滤;
l 这个 select 查询先根据 uid 和 name 进行属性投影(字段选择),而不是将属性全部取出以后再进行过滤;
l 将这两个查询条件联接起来生成最终查询结果;
7、Cache&Buffer
高速缓存区,查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。通过 LRU 算法将数据的冷端溢出,未来得及刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等;
8、Engine
存储引擎,存储引擎是 MySQL 与文件打交道的子系统。也是 MySQL 最具有特色的一个地方。MySQL 的存储引擎是插件式的,它根据 MySQLAB 公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)现在有很多种存储引擎,各个存储引擎的优势各不一样。MySQL 也支持自定义制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。
数据库与数据库实例
数据库:物理操作系统文件或其他形式文件类型的集合;
数据库实例:数据库后台进程或线程及一个共享内存区域组成,数据库实例是用来操作数据库文件的;
MySQL 是一个单进程多线程架构的数据库,与 SQL Server 类似。Oracle 数据库在 Linux OS 下是多进程,在 Windows 下也是单进程多线程。MySQL 数据库实例在系统上的表现就是一个进程。
MySQL常用存储引擎
存储引擎其实就是如何存储数据,如何为存储的数据建立索引以及如何更新、查询数据等技术实现的方法。
MySQL 中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平,并且最终提供广泛的不同功能和能力。在 MySQL 中将这些不同的技术及配套的相关功能称为存储引擎。
1、存储引擎查询
查看 MySQL 服务器支持的存储引擎及默认的存储引擎。存储引擎是针对数据表的,不是针对数据库的,通过如下命令查看具体表指定的存储引擎。
代码语言:javascript复制root@db22:10: [(none)] show engines; #查看数据库存储引擎
-------------------- --------- ---------------------------------------------------------------- -------------- ------ ------------
|Engine | Support |Comment | Transactions | XA | Savepoints |
-------------------- --------- ---------------------------------------------------------------- -------------- ------ ------------
|InnoDB | DEFAULT | Supportstransactions, row-level locking, and foreign keys | YES | YES | YES |
|MRG_MYISAM | YES | Collection of identical MyISAMtables | NO | NO | NO |
|MEMORY | YES | Hash based, stored in memory, useful fortemporary tables | NO | NO | NO |
|BLACKHOLE | YES | /dev/null storage engine (anything youwrite 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 |
-------------------- --------- ---------------------------------------------------------------- -------------- ------ ------------
9 rowsin set (0.00 sec)
root@db22:10: [(none)] show variables like'%engine%'; #查看数据库默认存储引擎
---------------------------------- --------
|Variable_name |Value |
---------------------------------- --------
|default_storage_engine | InnoDB|
|default_tmp_storage_engine | InnoDB|
|disabled_storage_engines | |
|internal_tmp_disk_storage_engine | InnoDB |
---------------------------------- --------
4 rowsin set, 1 warning (0.18 sec)
2、常用存储引擎
下表是各大存储引擎特点与应用场景的比较。
InnoDB 和 MyISAM 是最主流的两个存储引擎,现在数据库默认的存储引擎就是 InnoDB,且 MySQL 8.0 宣布 InnoDB 存储数据字典,MyISAM 彻底被废弃,脱离了 MySQL。
可以看出 InnoDB 优势还是很明显的。InnoDB 是 MySQL 数据库 5.5 版本后的默认存储引擎,默认所说的 MySQL 即指 InnoDB 存储引擎的 MySQL,那么关于 InnoDB 的体系结构下一次在一起来看看吧,今日就到这里啦。
参考资料
https://my.oschina.net/peakfang/blog/2240253
张甦 著 《MySQL王者晋级之路》