1.Mysql基本结构体系
MySql从概念上分为四层:
- 网络连接层
- 服务层(核心层)
- 存储引擎层
- 系统文件层
1.1网络连接层
接入方 支持协议很多。主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。
1.2服务层
服务层是MySQL的核心,MySQL的核心服务层都在这一层,查询缓存,查询解析,SQL执行计划分析,SQL执行计划优化。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。通过下图来观察服务层的内部结构:
Sql语句的执行过程
查询缓存
在解析查询之前,服务器会检查查询缓存,如果能找到对应的查询,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集。
解析器与预处理
MySQL会解析查询(解析器是由Lex和YACC实现的,参考资料)并创建了一个内部数据结构(解析树)。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理会根据MySQL的规则进一步检查解析树是否合法。比如要查询的数据表和数据列是否存在,也会检查当前连接的用户是否具有相关数据的访问权限等。
查询优化器
优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。优化器并不关心使用的什么存储引擎,但是存储引擎对优化查询是有影响的。优化器要求存储引擎提供容量或某个具体操作的开销信息来评估执行时间。
查询引擎
在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令调用存储引擎的接口得出结果。
1.3存储引擎
后面单独介绍
1.4文件系统
该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。 同时还包括日志(redo,undo)、索引、错误日志、查询记录、慢查询等
关于InnoDB存储引擎,其数据文件的格式除了.ibd外,还有.ibdata格式,两者的主要区别是.bd是以 独享表空间的方式来存储数据,每个表一个ibd文件,.ibdata是以共享表空间的方式来存储数据,所有的表共同使用一个ibdata文件,即所有的数据文件都存在一个文件中 。可以通过 innodb_file_per_table
参数来配置使用哪种方式来存储innoDB殷勤数据。
InnoDB默认使用的是独享表的存储方式,这种方式的好处是当数据库产生大量文件碎片的时,整理磁盘碎片对线上运行环境的影响较小
2.MySql存储引擎
可以通过如下命令查看当前mysql支持的存储引擎有哪些
mysql> show engines\G
*************************** 1. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
...
*************************** 7. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 8. row ***************************
可以看到InnoDB是mysql的默认存储引擎
-
Myisam
特点
Mysql5.5版本之前的默认存储引擎,较多的系统表也还是使用这个存储引擎,系统临时表也会用到Myisam存储引擎
- select count(*) from table 不需要进行数据的扫描
- 数据(MYD)和索引(MYI)分开存储
- 表级锁
- 不支持事务
-
Innodb
从MySQL5.5.8开始,InnoDB存储引擎是默认的存储引擎。
- 支持事务(ACID)
- 行级锁
- 以聚集索引(主键索引)方式进行数据存储
- 支持外键
-
NDB
-
CSV
文件大小很小,数据间以逗号隔开,可以直接通过文本编辑器来编辑csv数据文件,然后flush完成保存刷新,比如
flush table XXX
,数据安全性低应用场景
- 数据的快速导入导出
- 表格直接转换成csv
-
Falcon
-
Memory
数据都存储在内存中,IO效率要比其他引擎高很多,服务器重启数据会丢失,内存数据表默认只有16M
特点
-
支持hash索引,B Tree索引,默认hash(查找复杂度0(1)),
-
字段长度是固定长度 varchar(32)=char(32)
-
不支持大数据类型存储,如blog,text
-
表级锁
应用场景
-
等值查找热度较高数据
-
查询结果内存中的计算,大多数都是采用这种存储引擎作为临时表存储需要计算的数据
-
-
Archive
压缩协议进行数据的存储,数据存储为ARZ格式的文件
特点
- 只支持insert 和 search 两种操作
- 只允许自增ID列建立索引
- 行级锁
- 不支持事务
- 数据占用磁盘少
应用场景
- 日志系统
- 大量的数据采集
- 可以作为数据备份的选择(因为查询效率没有Innodb高,所以不适和作为实际运行数据库)
-
Merge
-
Faderated
…
Uer defined
Innodb和Mysiam的对比
对比项 | Innodb | Mysiam |
---|---|---|
存储文件 | .frm 表定义文件 .idb 数据文件 | .frm 表定义文件 .myd 数据文件 .my 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | ACID | 不支持 |
CRDU | 读、写 | 读多 |
count | 扫表 | 专门存储的地方 |
索引结构 | B+Tree | B+Tree |
Storage Engines Feature Summary
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree indexes | Yes | Yes | Yes | No | No |
Backup/point-in-time recovery (note 1) | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | Yes (note 2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
Foreign key support | No | No | Yes | No | Yes (note 5) |
Full-text search indexes | Yes | No | Yes (note 6) | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
Hash indexes | No | Yes | No (note 8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
本文参考自 https://blog.csdn.net/da_guo_li/article/details/80280289