《MySQL是怎样运行的》
《MySQL是怎样运行的》阅读笔记,更新中——
第一章 初始MySQL
1.1 启动MySQL客户端程序
-
启动MySQL命令
参数:
mysql -h主机名 -u用户名 -P端口 -p密码
如果要在一行命令中显式输入密码,那么-p后面接密码不能加空格(其它参数无所谓)
-
断开客户端与服务器的连接且关闭客户端
- 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-networking
和mysqld --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=MyISAM
或max_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 匹配的模式]
命令查看。