一、系统变量
1.1 系统变量简介
MySQL
服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为MySQL
系统变量,比如允许同时连入的客户端数量用系统变量max_connections
表示,表的默认存储引擎用系统变量default_storage_engine
表示,查询缓存的大小用系统变量query_cache_size
表示,每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。
1.2 查看系统变量
我们使用SHOW VARIABLES
查看当前的系统变量的值,通常都会带一个LIKE
过滤条件来查看我们需要的系统变量的值(因为系统变量比较多)。
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
mysql> SHOW VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
1.3 系统变量的作用范围
大部分的系统变量
都可以通过启动服务器时传送启动选项的方式来进行设置。启动时的系统变量修改主要方式就是第四段落的内容,通过启动命令行附件和配置文件。同时也可以在运行中修改。
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器,不过系统变量有作用范围之分。
多个客户端程序可以同时连接到一个服务器程序,对于同一个系统变量,不同的客户端可以有不同的设置,这就是变量的作用范围,主要分
GLOBAL
:全局变量,影响服务器的整体操作。SESSION
:会话变量,影响某个客户端连接的操作。(注:SESSION
有个别名叫LOCAL
)
在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值),所以通过启动选项设置的系统变量的作用范围都是GLOBAL
的,也就是对所有客户端都有效的。 注意并不是所有系统变量都具有GLOBAL
和SESSION
的作用范围,比如最大连接数是全局的,也有一些事客户端特有的。
通过客户端程序设置全局系统变量的语法,注意必须要带GLOBAL:
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者
SET [@@(GLOBAL|SESSION).]var_name = XXX;
举例:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
如果只想对本客户端生效,也就是说作用范围只针对当前客户端。
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
从上边的语句三
也可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION
。也就是说SET 系统变量名 = 值
和SET SESSION 系统变量名 = 值
是等价的。
查看系统变量SHOW VARIABLES命令如果不指明作用范围,默认查询的是当前客户端的系统变量。
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
1.4 启动选项和系统变量的区别
启动选项
是在程序启动时我们程序员传递的一些参数,而系统变量
是影响服务器程序运行行为的变量,它们之间的关系如下:
- 大部分的系统变量都可以被当作启动选项传入。
- 有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
啥的。 - 有些启动选项也不是系统变量,比如
defaults-file
。
二、状态变量
为了让我们更好的了解服务器程序的运行情况,MySQL
服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量
。比方说Threads_connected
表示当前有多少客户端与服务器建立了连接,Handler_update
表示已经更新了多少行记录等等。由于状态变量
是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。与系统变量
类似,状态变量
也有GLOBAL
和SESSION
两个作用范围的,类似的,如果我们不写明作用范围,默认的作用范围是SESSION
:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];