登录
首页 >  数据库 >  MySQL

MySQL快速入门07-MySQL的体系结构和存储引擎介绍

来源:SegmentFault

时间:2023-02-24 17:25:57 269浏览 收藏

你在学习数据库相关的知识吗?本文《MySQL快速入门07-MySQL的体系结构和存储引擎介绍》,主要介绍的内容就涉及到MySQL,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

1、MySQL体系结构简介

图片 1.png

上图来自官方手册

组成部分:
1.连接池组件
2.管理服务和工具组件
3.Sql接口组件
4.查询分析器组件
5.优化器组件
6.缓冲组件
7.插件式存储引擎(与其他数据库的主要区别)
8.物理文件

MySQL数据库区别与其他数据库最重要的一个特点就是其插件式的表存储引擎,MySQL插件式的表存储引擎,MySQL插件式的存储引擎结构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必须的,例如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发;

需要特别注意的是,存储引擎是基于表的,而不是数据库;

2、体系结构详细

MySQL的体系结构可以分为两层,MySQL Server层和存储引擎层,在MySQL Server层中又包括连接层和SQL层;

1、连接层

应用程序通过接口(如ODBC、JDBC)来连接MySQL,最先连接处理的是连接层,连接层包括通信协议、线程处理、用户名密码认证三个部分.通信协议负责检测客户端版本是否与服务端兼容,线程处理是指每一个连接请求都会分配一个对应独立的线程,用户名密码认证验证创建的账号和密码,以及host主机授权是否可以连接到MySQL服务器;

2、SQL层

SQL层包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划;
1) 权限判断可以审核用户有没有访问某个库、某个表,或者表里某行的权限.
2) 查询缓存通过Query Cache进行操作,如果数据在Query Cache中,则直接返回结果给客户端;
3) 查询解析器针对SQL语句进行解析,判断语法是否正确,并生成解析树;
4) 预处理器解决解析器无法解析的语义;
5) 优化器对SQL语句进行改写和相应的优化(例如对连接表重排序、对外连接专内连接、代数等价法则、计算和减少常量表达式、自查询优化、早期终结、相等传递等),并生成最优的执行计划;
然后就可以调用程序的API接口,通过存储引擎层访问数据;

3、存储引擎层

MySQL数据库的核心就在于存储引擎;

MySQL数据库是开源的,所以用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎,如果对现有存储引擎的性能或功能不满意,可以通过修改源码来得到想要的特性,这就是开源的力量;

存储引擎可以分为MySQL官方存储引擎和第三方存储引擎,InnoDB存储引擎早期就是第三方存储引擎,后来被Oracle收购,同时也是MySQL数据量OLTP在线事务处理应用最广泛的存储引擎;

1、InnoDB存储引擎
InnoDB存储引擎支持事务、其设计目标主要面向在线事务处理(OLTP)的应用,其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁,从MySQL数据库5.58版本开始,InnoDB存储引擎是默认的存储引擎;
InnoDB存储引擎将数据存放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身进行管理,从MySQL4.1(包括4.1)版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中,此外,InnoDB存储引擎支持用裸设备(row disk)用来建立其表空间;
InnoDB存储引擎通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别,同时,使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生,除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;
对于表中的数据存储,InnoDB存取引擎采用来聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放,如果没有显示地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键;

2、MyISAM存储引擎
MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据应用,在MySQL5.58版本之前MyISAM存储引擎是默认的存储引擎(除Windows版本外),数据库系统与文件系统很大的一个不同之处在于对事务的支持,然而MyISAM存储引擎是不支持事务的,这个也不是很难理解,试想一下用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有ETL这些操作,只是简单的报表查询是否还需要事务的支持呢?此外,MyISAM存储引擎的另一个与众不同的地方是它的缓冲池只缓存(cache)索引文件,而不是缓冲数据文件,这一点和大多数的数据库都非常不同;
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件,可以通过使用myisampack工具来进一步压缩数据文件,因为myisampack工具使用赫夫曼(Huffman)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,也可以通过myisampack来解压数据文件;
在MySQL5.0版本之前,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要指定MAX_WORS和AVG_ROW_LENGTH属性,从MySQL5.0版本开始,MyISAM默认支持256TB的但表数据,这足够满足一般应用需求;
注意:对于MyISAM存储引擎表,MySQL数据只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据的大部分数据库大不相同,此外,在MySQL5.1.23版本之前,无论是在32位还是64位操作系统环境中,缓存索引的缓冲区最大只能设置为4GB,在此之后的版本中,64位系统可以支持大于4GB的索引缓冲区了;

3、Memory存储引擎
Memory存储引擎(之前称HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或者发生崩溃,表中的数据都将消失,它非常适合用于存储临时数据的临时表,以及数据仓库中的纬度表,Memory存储引擎默认私用哈希索引,而不是B+数索引;
虽然Memory存储引擎速度非常快,但是在使用上还是有一定的限制,比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型,最重要的是,存储变长字段(varchar)时是按照定长地段(char)的方式进行的,因此会浪费内存;
还有一点,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result),如果中间结果集大于Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中;

4、Archive存储引擎
Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引,Archive存储引擎使用zlib算法将数据行(row)进行压缩存储,压缩比一般可达1:10,正如其名字所示,Archive存储引擎非常适合存储归档数据,如日志信息,Archive存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能;

5、Meria存储引擎
Maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎,Mria存取引擎的开发者是MySQL的创始人之一的Michael Widenius,因此,它可以看做是MyISAM的后续版本,Maria存储引擎的特点是:支持缓存数据和索引文件,应用了行锁设计,提供MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能;

4、查看当前数据库支持的存储引擎

show engines;

6666.png

5、使用不同存储引擎文件的大小

1、下载MySQL官方提供的示例库

为了测试,有时候需要大量的数据集,MySQL 官方提供了用于测试的示例数据库
下载地址为:https://dev.mysql.com/doc/index-other.html

2、解压

解压后,得到 3 个文件,只需要用到两个:
sakila-schema.sql :数据库结构文件
sakila-data.sql: 数据文件

3、导入MySQL

mysql> source /home/data/sakila-db/sakila-schema.sql;
mysql> source /home/data/sakila-db/sakila-data.sql;

未完待续..

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于数据库的相关知识,也可关注golang学习网公众号。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>