0%

《MySQL是怎样运行的》(一)

基础知识

客户端/服务器架构

  • mysqld:MySQL服务器程序,运行该程序可以启动一个服务器进程
  • mysql:MySQL客户端程序,运行该程序可以发送请求并接收服务器的处理结果
  • 客户端与服务器的连接
    • 本质:进程间通信
    • 网络通信协议:TCP/IP
    • 服务器默认端口:3306
    • 服务器处理的流程:连接管理 -> 解析与优化 -> 存储引擎
      • 连接管理:客户端可以携带主机信息、用户名与密码等信息,采用TCP/TP、命名管道或者共享内存、UNIX套接字等方式连接服务端。每当有客户端信息验证通过,连接到服务器端进程时,服务器端就会创建一个线程进行交互;当通信结束后,并不会立即销毁该线程,而是缓存起来,当有新的客户端连接时,将这个线程分配给新的客户端
      • 解析与优化:查询缓存 -> 语法解析 -> 查询优化
        1. 查询缓存 – 同样的请求会从缓存中查找结果,但是如果两个请求有任何字符上的不同,都会重新计算
        2. 查询优化 – 优化的结果是生成一个执行计划,可以通过explain来查看
      • 存储引擎:默认引擎是InnoDB
    • 实现效果:客户端向服务器发送一段文本(SQL语句),服务器进程处理后再向客户端返回一段文本

基本配置

  • 启动选项
    • 命令行修改
      仅对当次启动生效
    • 配置文件修改
      无论是Linux系统还是Windows系统,都有多个对应的配置文件查找路径,且路径之间有优先级
  • 系统变量
    • 系统变量有不同的作用范围,包括GLOBAL和SESSION
    • 大部分的系统变量可以当作启动项来设置,但是有些系统变量是程序运行过程中自动生成,无法修改

字符集和比较规则

  • 将字符映射成二进制称为编码,反之为解码。人们抽象出一个字符集的概念来描述某个字符范围的编码规则
    常见字符集:ASCII、ISO8859-1、GB2312等
  • 每个字符集有多个比较规则,比如是否区分重音、是否区分大小写等

数据存放

数据目录

  • MySQL会将数据存放到数据目录下,可以在客户端show variables like 'datadir'来查看数据目录
  • 数据目录中存放着系统数据库、用户自定义的数据库以及一些系统相关文件
    • mysql 系统数据库,在数据目录下有对应的子文件夹。该数据库存储MySQL的用户账户和权限信息、一些存储过程和事件的定义信息、一些运行过程中产生的日志信息、一些帮助信息以及时区信息等。
    • performance_schema 系统数据库,在数据目录下有对应的子文件夹。该数据库主要保存MySQL服务器运行过程中的状态信息,包括统计最近执行了哪些语句、在执行过程的每个阶段花费了多长时间、内存的使用情况等。
    • information_schema 系统数据库,在数据目录下没有对应的文件夹。该数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、视图、触发器、列、索引等。并不是真实的数据,而是以描述性信息的形式存在,也称之为元数据。
    • sys 系统数据库,在数据目录下有对应的文件夹。主要通过视图的形式把information_schema和performance_schema结合起来,让开发人员更方便地了解MySQL服务器的性能。
    • 用户数据库 用户自定义的数据库,在数据目录下有对应的子文件夹。详细信息见下文。
    • 服务器进程文件 一个服务器程序对应着一个进程,该文件存储着相关的进程ID
    • 服务器日志文件 包括查询日志、错误日志、二进制日志、redo日志等
    • SSL和RSA证书与密钥文件

用户数据库

  • 当用户创建了一个数据库,系统就会在数据目录下创建一个同名的文件夹,并且在这个文件夹中生成一个名为dp.opt的文件,该文件存储了数据库的相关信息,包括字符集、比较规则等。
    在MySQL8.0中未见到
  • 每个数据库对应的子文件夹下有两类文件,一类是描述表结构的文件,一类是数据文件
    1. InnoDB 在该引擎中,索引和用户记录都是当作数据来处理。数据存放在数据页中,采用表空间来管理数据页。表空间又包括多种类型,比如系统表空间和独立表空间
      1. 系统表空间 InnoDB会在文件目录下创建一个名为ibdata1,大小为12MB的文件(当容量不够时会自扩展)
        MySQL8.0版本在数据目录根目录下存在一个ibdata1
      2. 独立表空间 在MySQL5.6.6及以后的版本中,默认把数据存放到独立表空间中。每当建立一个新的表,就会创建一个新的独立表空间,其文件名是表名.ibd,存放在该表所属的数据库的子文件夹下,同时还会创建一个表名.frm文件,来记录表格的相关信息。
        此处存疑:在MySQL8.0的数据库子目录下,我只看到了表名.idb,没有看到表名.frm
    2. MyISAM 在该引擎中,索引和用户记录是分开存放的。其对应的子文件夹下有三类文件,分别是记录表结构的表名.ibd、记录用户记录的表名.MYD以及记录索引的表名.MY1.