文章目录

MySQL的体系结构

1.快速安装MySQL

参考上一篇《MySQL的初始化安装、简单加固》](https://xwder.com/blog/article/46.html)) 快速安装MySQL5.7.x数据库。

2.数据目录结构

2.1配置文件:my.cnf读取顺序

非Windows环境下的my.cnf的读取顺序是:

/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf

[root@localhost ~]# mysql --help|grep my.cnf  #查看my.cnf文件
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
[root@localhost ~]# mysql --help | grep 'Default options' -A 1  #查看my.cnf文件读取顺序
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

2.2MySQL的数据文件

数据文件包括:.frm、.MYI、.MYD、.ibd、.ibdata、.ib_logfile、undo*、ibtmp1、 auto.cnf、db.opt、.CSM、.CSV、.TRN、.TRG。

文件后缀 说明
.frm 表结构定义文件
.MYI MyISAM存储引擎索引文件
.MYD MyISAM存储引擎数据文件
.ibd InnoDB存储引擎独立表空间文件
.ibdata* InnoDB存储引擎共享表空间文件
.ib_logfile* InnoDB存储引擎redo log文件
undo* InnoDB存储引擎独立undo文件
ibtmp1 InnoDB存储引擎临时表空间文件
auto.cnf 用于存放MySQL实例的全局唯一的server-uuid的文件
db.opt 用于存放MySQL实例的schema级别的默认字符集和默认校对规则的文
.CSM 用于存放CSV存储引擎的元数据等相关信息的文件
.CSV 用于存放CSV存储引擎的数据文件,每行数据的列值之间使用逗号分隔
.TRN 用于存放与触发器相关的元数据
.TRG 用于存放触发器定义语句以及与定义相关的信息

2.3MySQL的日志文件

日志文件:error.log(error log)、localhost.log(general log)、mysql-bin.(binlog)、

mysql-relay-bin.(relay log)、slow-query.log(slow log)。

  • error.log(error log):错误日志,记录着MySQL启动之后mysqld打印的相关信

息。错误日志文件在MySQL Server启动之后必须存在;否则,在使用mysqld_safe启动数据库时会因为找不到错误日志文件而报错,终止启动过程(如果直接使用mysqld程序来启动数据库,则不会有这个问题,因为mysqld进程发现错误日志不存在时会重新创建)。

  • localhost.log(general log):一般查询日志,启用该日志之后,在MySQL Server中执行的所有SQL语句都会被记录。查询日志可以在MySQL Server启动之后动态开关、自动创建。

  • mysql-bin.*(binlog):二进制日志,用于复制架构中的数据同步(从库I/O线程从主库读取),MySQL Server中涉及数据变更的SQL语句都会被记录,可以指定单个文件的大小,写满指定大小的文件之后自动切换到一个新文件。

  • mysql-relay-bin.*(relay log):中继日志,用于复制架构中的数据同步(从库I/O线程从主库读取binlog之后写入自身的中继日志中)。

  • slow-query.log(slow log):慢查询日志,SQL语句的执行时间超过指定时间,被认为执行缓慢,会被记录到该文件中。
    (4)其他文件:mysql.pid(pid)、mysql.sock(socket)、mysql.sock.lock(socket lock)。

2.4其他文件

  • mysql.pid(pid):MySQL Server启动之后存放进程号的文件。
  • mysql.sock(socket):MySQL Server启动之后用于本地UNIX Domain通信的sock文件。
  • mysql.sock.lock(socket lock):MySQL Server启动之后用于锁定本地socket文件的锁标记文件。这是MySQL 5.7.x版本中新增的,如果MySQL Server非正常关闭,该文件可能残留而导致MySQL重新启动失败,删除该文件重新启动即可。

3.MySQL Server的体系结构

  • Connectors(连接者):指的是不同语言中与SQL的交互,从图3-1中可以看到目前流行的语言都支持MySQL客户端连接。
  • Connection Pool(连接池):管理缓冲用户连接、线程处理等需要缓存的需求。在这里也会进行用户账号、密码和库表权限验证。
  • SQL Interface(SQL接口):接收用户执行的SQL语句,并返回查询的结果。
  • Parser(查询解析器):SQL语句被传递到解析器时会进行验证和解析(解析成MySQL认识的语法,查询什么表、什么字段)。解析器是由Lex和YACC实现的,是一个很长的脚本。其主要功能是将SQL语句分解成数据结构,并将这个结构传递到后续步骤中,后续SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,则说明该SQL语句可能有语法错误或者不合理。
  • Optimizer(查询优化器):在查询之前,SQL语句会使用查询优化器对查询进行优化(生成查询路径树,并选举一条最优的查询路径)。它使用“选取—投影—连接”策略进行查询。
  • Caches& Buffers(缓存&缓冲):主要包含QC以及表缓存、权限缓存等。对于QC,以往主要用于MyISAM存储引擎,目前在MySQL 8.0中已放弃,对于现在非常流行的InnoDB存储引擎来讲,QC已无任何意义,因为InnoDB存储引擎有自己的且非常完善的缓存功能。除QC之外(记录缓存、key缓存,可使用参数单独关闭),该缓存机制还包括表缓存和权限缓存等,这些是属于Server层的功能,其他存储引擎仍需要使用。
  • Pluggable Storage Engines(插件式存储引擎):存储引擎是MySQL中具体的与文件打交道的子系统,也是MySQL最具特色的一个地方。MySQL的存储引擎是插件式的,它根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。目前存储引擎众多,且它们的优势各不相同,现在最常用于OLTP场景的是InnoDB(当然也支持OLAP存储引擎,但MySQL自身的机制并不擅长OLAP场景)。
  • Files& Logs(磁盘物理文件):包含MySQL的各个引擎的数据、索引的文件,以及redo log、undo log、binary log、error log、query log、slow log等各种日志文件。
  • File System(文件系统):对存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取。常见的文件系统包括XFS、NTFS、EXT4、EXT3、NFS等,通常数据库服务器使用的磁盘建议用XFS。

MySQL中有一个查询会话请求,那么大概流程如下:

  1. MySQL客户端对MySQL Server的监听端口发起请求。
  2. 在连接者组件层创建连接、分配线程,并验证用户名、密码和库表权限。
  3. 如果打开了query_cache,则检查之,有数据直接返回,没有继续往下执行。
  4. SQL接口组件接收SQL语句,将SQL语句分解成数据结构,并将这个结构传递到后续步骤中(将SQL语句解析成MySQL认识的语法)。
  5. 查询优化器组件生成查询路径树,并选举一条最优的查询路径。
  6. 调用存储引擎接口,打开表,执行查询,检查存储引擎缓存中是否有对应的缓存记录,如果没有就继续往下执行。
    到磁盘物理文件中寻找数据。
  7. 当查询到所需要的数据之后,先写入存储引擎缓存中,如果打开了query_cache,也会同时写进去。
    返回数据给客户端。
  8. 关闭表。
  9. 关闭线程。
  10. 关闭连接。

以上内容摘取自:《千金良方:MySQL性能优化金字塔法则》