MySQL提高篇(二)--- MySQL的逻辑架构和物理结构

MySQL的逻辑架构

在这里插入图片描述
从上图可以看到,MySQL从逻辑上可以由这些部分组成:
一、连接池组件
  管理数据库连接,包括权限认证、连接限制等功能。
二、管理服务和工具组件
  系统管理和控制工具
三、SQL接口组件
  接收用户的SQL命令,返回sql执行结果。
四、解析器组件
  对SQL语句进行语法和语义解析,形成语法树。
五、优化器组件
  对SQL语句进行优化,如:选择合适的索引、多表关联时决定表关联顺序等,最终决定SQL的执行计划。
六、缓冲组件
  将SQL语句作为key,sql语句查询结果作为value进行缓存。但是它对内存损耗较为严重,且缓存在一些情况下被清空:
       1、SQL语句变化
       2、被查询的表数据变化
因此MySQL8.0版本开始不支持缓存。
七、存储引擎组件
MySQL的存储引擎是基于表层面的,即可以为每一张表使用不同的存储引擎。经常使用的存储引擎还是InnoDB。

MySQL中的执行流程

而MySQL的一条SQL的执行流程就可以表述如下:
在这里插入图片描述

MySQL的物理存储分析

实际上,MySQL数据库可以被看作是一个由MySQL软件管理的文件系统。其从物理层面来说,其内部不同的数据都被存储为不同格式的文件,而对于不同的存储引擎数据存储方式也是不一样的。
  了解MySQL物理文件结构之前先介绍两个概念:顺序IO随机IO
什么是顺序IO呢?我们知道在程序读取磁盘上的数据时需要经过一个寻址的过程,顺序IO就是读写数据时都是在连续的存储区域内进行,这样就节约了寻址时间,其优点就是读写速度快但是消耗更多的存储空间,因为磁盘上不一定总是有那么多连续的存储空间供程序使用;而随机IO是在磁盘上寻找合适的位置存放数据,它的优点就是节约存储空间,但是需要更多的时间进行IO操作
  MySQL重要的文件可以分为日志文件和数据索引文件,在linux系统上被保存在/var/lib/mysql目录下,在MySQL中,其日志文件是采用顺序IO的方式进行读写操作,而数据索引文件是采用随机IO的方式进行读写操作。至于为什么采用这种方式其实设计到MySQL实现持久性机制的Write-ahead-log机制,后面写事务相关知识时候会讲到。

MySQL日志文件分类:

  通过show variables like 'log_%'命令查看MySQL中的日志使用信息:
在这里插入图片描述
错误日志: 错误日志中记录了MySQL启动及运行时发生的错误的信息。通过上面的log_error 的value可以看到错误日志的位置。在我的云服务器上它就是/var/log位置的mysqld.log文件。/etc/my.cnf中的log-error可以设置错误日志的位置。
在这里插入图片描述
二进制日志(bin log):它记录了MySQL客户端所有的DDL和DML操作,所以很明显其作用就可以用来做主从复制、数据备份、数据恢复等。可以看到它默认没有开启,可以通过在/etc/my.cnf文件中来设置log_bin=mysql-bin来开启。值得注意的是,每一条DDL语句执行完毕后都会写到bin_log中,但是DML语句只有在事务提交后才写入。
在这里插入图片描述
慢查询日志(slow query log):这个就很重要了,因为我们可以通过它去定位系统中查询慢的sql语句,它默认是关闭的,我们去开启它需要在/etc/my.cnf文件中添加如下设置:它的含义就是当查询超过10s时,它就会被记录在慢查询日志log_filename中。

slow_query_log=on
slow_query_time=10
slow_query_log_file=log_filename

事务日志(redo log / undo log):这两个日志的功能有很多,后面需要慢慢讲。这里先理解redo log的作用是保证事务的持久性,即事务提交过程中服务器崩溃,事后仍然可以通过redo log去恢复。而undo log的作用就是事务提交失败作回滚操作,还有一个作用是实现MySQL的MVVC(多版本并发控制)机制,这些都需要后面详细说明。

MySQL数据索引文件:

  除了上面重要的日志文件,还有很重要的文件自然是保存在MySQL数据库中的数据了,在InnoDB存储引擎中,表结构的定义信息保存在.frm文件中,而数据信息和索引信息都保存在.ibd文件中。
在这里插入图片描述
从上图可以看出,在liuming这个数据库中,我有三张表:account、table1、table2。

好记性不如烂笔头,与诸君共勉!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章