vlambda博客
学习文章列表

mysql(二)数据库架构和存储引擎

本期内容大纲:

1.mysql数据库架构

2.mysql运行流程

3.mysql数据库引擎

4.福利派送


1.mysql数据库架构

mysql的各个模块示意图如下:

mysql(二)数据库架构和存储引擎

(1)连接管理与安全验证

每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些连接;如果客户端需要连接到MYSQL数据库还需要进行验证,包括用户名、密码、主机信息等。

(2)解析器

解析器的作用主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还有解析器会查询缓存,如果在缓存中有对应的语句,就返回查询结果不进行接下来的优化执行操作。前提是缓存中的数据没有被修改,当然如果被修改了也会被清出缓存。

(3)优化器

优化器的作用主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方式,包括获取查询的开销信息,统计信息等,这也是为什么图中会有优化器指向存储引擎的箭头。之前在别的文章没有看到优化器跟存储引擎之间的关系,在这里我个人的理解是因为优化器需要通过存储引擎获取查询的大致数据和统计信息。

(4)执行器

执行器包括执行查询语句,返回查询结果,生成执行计划包括与存储引擎的一些处理操作。

(5)存储引擎

MyISAM 和 InnoDB是最常见的两种存储引擎,特点如下:

MyISAM存储引擎

MyISAM是MySQL官方提供默认的存储引擎,其特点是不支持事务、表锁和全文索引,对于一些 OLAP(联机分析处理)系统,操作速度快。每个 MyISAM 在磁盘上存储成三个文件。文件名都和表名相同,扩展名分是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。这里特别要注意的是 MyISAM 不缓存数据文件,只缓存索引文件。

InnoDB 存储引擎

InnoDB 存储引擎支持事务,主要面向 OLTP(联机事务处理过程)方面的应用,其特点是行锁设置、支持外键,并支持类似于 Oracle 的非锁定读,即默认情况下读不产生锁。InnoDB 将数据放在一个逻辑表空间中(类似Oracle)。InnoDB 通过多版本并发控制来获得高并发性,实现了 ANSI 标准的 4 种隔离级别,默认为 Repeatable,使用一种被称为 next-key locking 的策略避免幻读。对于表中数据的存储,InnoDB 采用类似 Oracle 索引组织表 Clustered 的方式进行存储。InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 Myisam 的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

2.mysql运行流程

mysql运行流程示意图如下:

mysql(二)数据库架构和存储引擎

(1)授权认证

客户端先要发送用户信息去服务器端进行授权认证。

如果使用的是命令行工具,通常需要输入信息:

mysql -h 主机名(IP) -u 用户名 -P 端口 -p

其中:-h 表示要连接的数据库服务器的主机名或者 IP 信息;-u 表示数据库的用户名称;-P 表示数据库服务器的端口号;小写的 -p 表示需要输入数据库的密码。当输入正确密码之后可以连接到数据库了。

(2)语法分析

MySQL 服务器拿到 SQL 命令之后,会使用 MySQL 的分析器解析 SQL 指令,同时会根据语法分析器验证 SQL 指令,查询 SQL 指令是否满足 MySQL 的语法规则。如果不支持此语法,则会提示“SQL syntax”语法错误信息。

(3)执行优化

当分析器验证并解析 SQL 命令之后,会进入优化器阶段,执行生成计划,并设置相应的索引。

(4)执行并返回结果

进入了执行器阶段,并开始正式执行 SQL 命令。同样在执行命令之前,它会先对你的执行命令进行权限查询,看看是否有操作某个表的权限,如果有相应的权限,执行器就去调用 MySQL 数据库引擎提供的接口,执行相应的命令;如果是非查询操作会记录对应的操作日志,再命令执行完成之后返回结果给客户端。

其中:需要注意的是,如果执行的是 select 语句并且是 MySQL 8.0 之前的版本的话,则会去 MySQL 的查询缓存中查看之前是否有执行过这条 SQL;如果缓存中可以查到,则会直接返回查询结果,这样查询性能就会提升很高。

3.mysql数据库引擎

我们可以使用 SHOW ENGINES 命令来查看 MySQL 数据库使用的存储引擎:

常用的数据库引擎有 InnoDB、MyISAM、MEMORY 等,其中 InnoDB 支持事务功能,而 MyISAM 不支持事务,但 MyISAM 拥有较高的插入和查询的速度。而 MEMORY 是内存型的数据库引擎,它会将表中的数据存储到内存中,因为它是内存级的数据引擎,因此具备最快速的查询效率,但它的缺点是,重启数据库之后,所有数据都会丢失,因为这些数据是存放在内存中的。

如何选择数据库的引擎?

选择数据库引擎要从实际的业务情况入手,比如是否需要支持事务?是否需要支持外键?是否需要支持持久化?以及是否支持地理位置存储以及索引等方面进行综合考量。

常用的数据库引擎是 InnoDB,它是 MySQL 5.5.5 之后的默认引擎,其优点是支持事务,且支持4种隔离级别,如下:

读未提交:也就是一个事务还没有提交时,它做的变更就能被其他事务看到。

读已提交:指的是一个事务只有提交了之后,其他事务才能看得到它的变更。

可重复读:此方式为默认的隔离级别,它是指一个事务在执行过程中(从开始到结束)看到的数据都是一致的,在这个过程中未提交的变更对其他事务也是不可见的。

串行化:是指对同一行记录的读、写都会添加读锁和写锁,后面访问的事务必须等前一个事务执行完成之后才能继续执行,所以这种事务的执行效率很低。

InnoDB 还支持外键、崩溃后的快速恢复、支持全文检索(需要 5.6.4+ 版本)、集群索引,以及地理位置类型的存储和索引等功能。

MyISAM 引擎是 MySQL 原生的引擎,但它并不支持事务功能,这也是后来被 InnoDB 替代为默认引擎的主要原因。MyISAM 有独立的索引文件,因此在读取数据方面的性能很高,它也支持全文索引、地理位置存储和索引等功能,但不支持外键。

InnoDB 和 MyISAM 都支持持久化,但 MEMORY 引擎是将数据直接存储在内存中了,因此在重启服务之后数据就会丢失,但它带来的优点是执行速度很快,可以作为临时表来使用。

4.福利派送

你还在为通货膨胀工资缩水而烦恼吗?

你还在为不知道怎么打理零花钱而着急吗?

你还在为每月月光而焦虑吗?

你还在为不知道怎么管理家庭钱财而迷茫吗?

你还在为不知道怎么理财投资而苦恼吗?

你想获得非工资收入吗?

你想早日实现财务自由吗?

。。。。。。

隆重推荐以下《小白理财训练营》课程,赶快扫码学习,掌握知识和技能后终身受益~

总结:

本期内容主要介绍了mysql的基本架构,熟悉各个模块以及sql的运行流程,有助于对sql语句的优化。本期内容到此结束,下期见~