《MySQL是怎样运行的》

《MySQL是怎样运行的》阅读笔记,更新中——

第一章 初始MySQL


1.1 启动MySQL客户端程序

  1. 启动MySQL命令

    参数:mysql -h主机名 -u用户名 -P端口 -p密码

    如果要在一行命令中显式输入密码,那么-p后面接密码不能加空格(其它参数无所谓)

  2. 断开客户端与服务器的连接且关闭客户端

    • quit
    • exit
    • \q

1.2 服务器处理客户端请求

查询请求执行过程

1. 连接管理

  • 客户端进程可以采用TCP/IP、命名管道或共享内存、UNIX域套接字等几种方式与服务器进程建立连接
  • 当有一个客户端进程连接到服务器进程时,服务器进程会创建一个线程处理交互;当客户端退出时,服务器并不会立即销毁线程,而是缓存起来,给后面连接的使用。这样就不用频繁创建和销毁线程,从而节省了开销。
  • 我们可以通过采用传输层安全性(Transport Layer Security, TLS)协议对连接进行加密,来保证数据传输安全性。

2. 解析与优化

  • 查询缓存:将刚刚处理过的查询请求和结果返回起来,方便下一次请求直接从缓存中查找结果,,且可以在不同客户端之间共享。
  • 语法解析:请求得来的是一段文本,所以MySQL服务器对文本进行分析处理,判断语法是否正常,然后将要查询的表等信息放到服务器内部使用的一些数据结构上。
  • 查询优化:外连接转为内连接、表达式简化、子查询转为连接等等,优化结果为生成一个执行计划。可以使用EXPLAIN语句查看某个语句的执行计划。

3. 存储引擎

  • 到查询优化结束为止,仍然没有真正访问真实的表中数据(其实之前的查询优化中也会访问表中少量数据), 而数据的存储和提取操作都封装到了一个名为存储引擎的模块中。
  • 表是一行一行的记录,等等,这些都是一个逻辑上的概念。在物理上如何表示记录、读取、写入数据到具体的物理存储器上,都是储存引擎负责的事情。
  • 把存储引擎之前叫做server层,那么server层和存储引擎层交互一般以记录为单位,如果一条记录符合要求,那么就发送到一个缓冲区,等缓冲区满了,才向客户端发送记录。缓冲区大小由系统变量net_buffer_lenght控制。

1.3 存储引擎的一些操作

  • 查看当前服务器支持的存储引擎:SHOW ENGINES;

  • 创建表时指定存储引擎:CREATE TABLE 表名(

    建表语句

    )ENGINE = 存储引擎名称

  • 修改表的存储引擎:

    ALTER TABLE 表名 ENGINE = 存储引擎名称



第二章 启动选项和系统变量

2.1 启动选项和配置文件

  • MySQL的服务器程序有很多设置项(比如允许同时连入的客户端数量查询缓存的大小等等)

  • MySQL的客户端程序可以设置连接的程序服务器所在的主机名或IP地址,用户名密码等信息。

   由此这些设置项有默认值,即为启动选项。启动选项可以在命令行中指定,也可以在配置文件中指定

在命令行中设置的启动选项只对当次启动生效,配置文件一次配置,永久生效。


2.1.1 命令行中指定选项

如果想在启动服务器程序禁止客户端使用TCP/IP网络进行通信,可以在启动时添加--skip-networking选项。

关于启动选项的格式:

命令行中指定启动选项时要加上--前缀。另外,如果名称是多个单词构成的,那么中间用短线-连接或者下划线_都是可以的。

比如这两个等价:mysqld --skip-networkingmysqld --skip_networking


通用格式:

--启动选项1[=值1] --启动选项2[=值2] --启动选项3[=值3]

(注意=前后不能加空格,必须挨着)


选项的简化形式:

长形式 短形式 含义
--host -h 主机名
--user -u 用户名
--password -p 密码
--port -P 端口
--version -V 版本信息

(注意-p小写的是密码,-P大写是指定端口)


2.1.2 配置文件中使用选项

将配置文件放到指定的位置,MySQL程序会在启动时在多个路径下寻找配置文件,这个路径有的是固定的,有的可以在命令行中指定。


Windows 操作系统的配置文件

路径名 备注
%WINDIR%\my.ini,%WINDIR%\my.cnf
C:\my.ini,C:\my.cnf
BASEDIR\my.ini,BASEDIR\my.cnf
defaults-extra-file 命令行指定的额外配置文件路径
%APPDATA%MySQL\ .mylogin.cnf 登录路径选项(仅限客户端)
  • %WINDIR%通常指C:WINDOWS。可以使用 echo %WINDIR% 命令来查看

  • BASEDIR指的是MySQL按照目录的路径,比如我的Windows机器是C:\ProgramData\MySQL\MySQL Server 8.0

  • defaults-extra-file是指定值来添加额外的配置文件路径,比如可以这么写

    mysqld --defaults-extra-file=C:\Users\Desktop\my_extra_file.txt
    
  • %APPDATA%表示Windows应用程序数据目录的值,可以使用echo %APPDATA% 命令查看

  • `\ .mylogin.cnf``有点特殊,它是一个使用mysql_config_editor应用程序创建的加密文件,文件内容只能包含一些在启动客户端程序时用于连接服务器的选项,包括host、user、password、port和socket,并且只能被客户端程序使用。


类UNIX操作系统中的配置文件

路径名 备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 命令行指定的额外配置文件路径
~/ .my.cnf 特殊于用户的选项
~/ .mylogin.cnf 特定于用户的登录路径选项(仅限客户端)
  • SYSCONFDIR表示在使用CMake构建MySQL时使用SYSCONFDIR选项指定的目录
  • MYSQL_HOME是一个环境变量,该变量的值是我们自己设置的
  • 表中最后两个~开头的路径是和用户相关的。每个用户都可以有一个用户目录,不用用户的配置文件就可以不一样。

配置文件的内容

配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]括起

[server]
(具体的启动选项...)

[mysqld]
(具体的启动选项...)

[mysqld_safe]
(具体的启动选项...)

[client]
(具体的启动选项...)

[mysql]
(具体的启动选项...)

[mysqladmin]
(具体的启动选项...)


通用格式:

[server]

option1 # 这是option1的注释

option2 = value2 # 这是option2的注释


选项组

在配置文件中,不用的选项组是给不同的程序使用的。如果这个选项组的名称和程序名称相同,那么显然这个选项组就应用于这个程序上。比如[mysqld]选项组就应用于mysqld服务器,[mysql]应用于mysql服务器。

有两个选项组需要注意一下:

  • [server] 组中的启动选项将作用于所有的服务器程序
  • [client] 组中的启动选项将作用于所有的客户端程序

可以通过以下几个例子看出来:

程序名 类别 能读取的组
mysqld 启动服务器 [mysqld]、[server]
mysqld_safe 启动服务器 [mysqld]、[server]、[mysqld_safe]
mysql.server 启动服务器 [mysqld]、[server]、[mysql.server]
mysql 启动客户端 [mysql]、[client]
mysqladmin 启动客户端 [mysqladmin]、[client]

使用MySQL版本的专用选项组

我们可以定义一个[mysqld-5.7]的选项组,含义和[mysqld]一样,只不过只有版本号为5.7的mysqld程序能使用这个选项组的选项。


配置文件的优先级问题

  • 对于各个配置文件来说:各个配置文件读取的优先级按照上图表中给出的顺序依次读取。那么当我们在多个配置文件中设置相同的启动选项,那么就会以最后一个配置文件为准。
  • 对于同一个配置文件来说:以最后一个出现在组中启动选项为准。
  • 关于命令行和配置文件的优先级:如果同一个启动选项既出现在命令行中,又在配置文件中,以命令行的启动选项为准。

default-file的使用

如果我们不想让MySQL到默认的路径下搜索配置文件,那么可以直接在命令行指定default-file选项。这样只会按照这一个文件配置。

mysqld --default-file=/tmp/myconfig.txt

🚨这里请注意 defaults-extra-file 和 defaults-file 的区别。

前者是添加额外配置(固定的配置文件也会被搜索);后者是以这一个文件为准。



2.2 系统变量


查看系统变量

SHOW VARIABLES [LIKE 匹配的模式];

例如:

SHOW VARIABLES LIKE 'default%';  // 查出所有以default开头的系统变量值

启动变量和系统变量的区别

启动变量

  • 启动变量是在MySQL服务器启动时设置的参数,这些参数控制着服务器启动后的行为。
  • 启动变量可以在命令行上设置,也可以在配置文件中设置。
  • 启动变量的更改只在当前服务器启动期间有效,如果服务器重新启动,这些更改将不再有效。
  • 启动变量的名称可以用’-‘或’_'连接,例如--default-storage-engine=MyISAM--max-connections=10

系统变量

  • 系统变量是MySQL自带的变量参数,用于对MySQL服务器的配置,其对所有客户端生效。
  • 系统变量可以在服务器运行过程中进行动态修改,无需停止并重启服务器。
  • 系统变量根据其作用范围可分为全局级(Global)和会话级(Session)。全局变量影响服务器的整体操作,会话变量只影响某个客户端连接的操作。
  • 系统变量的名称只能用’_'连接,例如default_storage_engine=MyISAMmax_connections=10

总的来说,启动变量和系统变量都是用于配置MySQL服务器的参数,但它们的应用场景和使用方式有所不同。启动变量主要用于服务器启动时的配置,而系统变量则可以在服务器运行过程中动态修改,提供了更大的灵活性。

(此回答由AI生成)


设置系统变量

  • 系统变量有作用范围的概念,分为GLOBAL(全局范围)SESSION(会话范围)

  • 系统一开始会初始化一个GLOBAL的系统变量,之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个SESSION的系统变量,初始化成和GLOBAL一样。

  • 然后你就可以通过 SET [GLOBAL|SESSION] 系统变量名 = 值;来修改了。如果省略GLOBAL|SESSION不写,那就是SESSION。

🚨注意,如果某个客户端改变了某个系统变量在GLOBAL作用范围的值,是不会影响之前已经连接的客户端作用范围为SESSIOIN的值的,只会影响后续连入的客户端作用范围为SESSIOIN的值。

🚨注意,一些系统变量只有GLOBAL作用范围,比如 max_connections;一些系统变量只有SESSION范围,比如 insert_id;大部分系统变量是两个范围都有,比如 default_storage_engine。


状态变量

MySQL的状态变量(status variables)记录的是MySQL服务器的运行状态信息。这些变量对用户来说是只读的,MySQL自身在运行过程中会自动更新这些状态信息。

可以使用SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式]命令查看。

posted @ 2023-09-23 23:52  vLiion  阅读(231)  评论(0编辑  收藏  举报