全局系统变量与会话系统变量
全局系统变量
全局系统变量是MySQL服务器级别的配置参数,控制着整个数据库实例的运行行为。它们具有以下核心特性:服务器级作用域:影响所有客户端连接、持久性配置:可通过配置文件永久保存、初始化加载:在MySQL服务启动时加载、集中管理:由数据库管理员(DBA)统一控制。
这个就好比主包之前有讲过的Maven的父pom和子pom的关系差不多,每个新的会话都会继承全局的环境变量,这个会话大家可以理解成一个一个连接窗口。
-- 基础语法(需要SUPER权限)
SET GLOBAL variable_name = value;
-- 实际示例
SET GLOBAL max_connections = 1000; -- 修改最大连接数
SET GLOBAL wait_timeout = 300; -- 修改超时时间(秒)
-- 等效语法(使用@@global.)
SET @@global.max_connections = 500;
-- 修改并写入配置文件(立即生效+持久化)
SET PERSIST max_connections = 1000;
-- 仅持久化到配置(下次启动生效)
SET PERSIST_ONLY innodb_buffer_pool_size = 8 * 1024 * 1024 * 1024;
# my.cnf或my.ini文件
[mysqld]
max_connections = 1000
innodb_buffer_pool_size = 8G
#重启命令
sudo systemctl restart mysqld
修改方式 |
存储位置 |
持久性 |
---|---|---|
SET GLOBAL |
内存 |
临时性(重启失效) |
SET PERSIST |
mysqld-auto.cnf |
永久 |
配置文件修改 |
my.cnf/my.ini |
永久 |
这个全局系统变量修改是需要权限的,因为修改后除了已经创建的会话连接,其他的新连接都会继承修改后的配置,这个行为其实是十分危险的需要权限也是理所应当的,下面这个是权限对照表,此外不是所以的修改都会立即生效,因为有些是静态变量比如说内存大小啊这种,都是需要重启的时候才能更改的。
变量类型 |
修改操作 |
所需权限 |
示例 |
---|---|---|---|
全局系统变量 |
SET GLOBAL |
SUPER或SYSTEM_VARIABLES_ADMIN |
|
持久化全局变量 |
SET PERSIST |
SYSTEM_VARIABLES_ADMIN |
|
会话系统变量 |
SET SESSION |
普通用户权限 |
|
用户自定义变量 |
SET @var |
仅需连接权限 |
|
会话系统变量
会话系统变量(SESSION variables)是MySQL中仅对当前数据库连接生效的配置参数,具有以下核心特性:连接隔离性:每个连接维护自己独立的变量副本、继承性:新建连接时从全局变量继承初始值、临时性:连接关闭后所有修改自动丢弃、优先级:会话设置会覆盖继承的全局值。
-- 标准语法
SET SESSION 变量名 = 值;
-- 示例:修改当前会话的超时时间
SET SESSION wait_timeout = 600; -- 单位:秒
-- 等效简写(SESSION可省略)
SET wait_timeout = 600;
SET @@session.wait_timeout = 600;
SET @@wait_timeout = 600;
其实和全局系统变量的修改基本上是相同的,只是前面的关键词是不一样的。下面这个表就是对于用户自定义变量的要求,从表里我们可以看到无论是全局的还是会话的其实都是不支持用户自定义一个系统变量的,这个就有点让主包失望了,因为这样少了很多可玩性。
变量类型 |
前缀 |
是否可新增 |
作用范围 |
持久性 |
示例 |
---|---|---|---|---|---|
全局系统变量 |
无 |
❌ 不可新增 |
整个MySQL实例 |
重启失效(除非持久化) |
|
会话系统变量 |
无 |
❌ 不可新增 |
当前连接 |
连接结束失效 |
|
用户会话变量 |
|
✅ 可自定义 |
当前连接 |
连接结束失效 |
|
局部变量 (存储过程) |
无 |
✅ 可自定义 |
当前BEGIN-END块 |
过程执行结束 |
|
查询系统变量
-- 查看所有会话变量
SHOW SESSION VARIABLES;
SHOW VARIABLES; -- SESSION可省略
-- 模糊匹配查询
SHOW SESSION VARIABLES LIKE 'sql%';
-- 精确查询单个变量
SHOW VARIABLES LIKE 'autocommit';
#select形式
-- 查询当前会话值
SELECT @@SESSION.autocommit;
SELECT @@autocommit; -- SESSION可省略
-- 对比全局和会话值
SELECT
@@GLOBAL.autocommit AS global_val,
@@SESSION.autocommit AS session_val;
他们俩的查询都是基本上一样的,只是关键词不一样,现在我们来说一下他们的作用,一般情况下我们是用不到的,只有在对性能有要求的时候才会用到,从上面的几个示范sql就能看到什么连接信息啊、内存最大容量啦这种,下面这个表是比较普通的使用场景,给大家理解一下这个玩意的作用。
场景分类 |
全局系统变量适用场景 |
会话系统变量适用场景 |
---|---|---|
资源配置 |
服务器内存/线程/IO分配 |
当前连接专用内存设置 |
性能调优 |
引擎级参数优化 |
特定查询的临时优化 |
安全控制 |
实例级访问策略 |
连接级权限控制 |
数据一致性 |
复制拓扑配置 |
事务隔离级别设置 |
功能开关 |
全局日志/插件管理 |
会话调试工具启用 |
多租户管理 |
基础硬件资源分配 |
租户专属时区/字符集 |
MyBatis-Plus 调用存储过程
今天再来补充一下上一篇的内容,因为上一篇讲存储过程的时候,主包忘记说怎么使用存储过程了,这一篇补税。
先定义一个存储过程
DELIMITER //
CREATE PROCEDURE sp_get_adult_employees( IN p_age INT,OUT p_total INT)
BEGIN
-- 查询所有成年员工
SELECT * FROM employee WHERE age > p_age;
-- 返回总人数
SELECT COUNT(*) INTO p_total FROM employee WHERE age > p_age;
END //
DELIMITER ;
然后定义实体类
@Data
public class Employee {
private Long id;
private String name;
private Integer age;
private String department;
// 其他字段...
}
@Data
public class EmployeeResult {
private List<Employee> employeeList;
private Integer totalCount;
}
然后定义xml和映射
<!-- EmployeeMapper.xml -->
<resultMap id="employeeResultMap" type="com.example.EmployeeResult">
<!-- 映射第一个结果集到List -->
<collection property="employeeList" ofType="com.example.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="department" column="department"/>
<!-- 其他字段映射 -->
</collection>
<!-- 映射输出参数 -->
<result property="totalCount" column="total" jdbcType="INTEGER"/>
</resultMap>
<select id="getAdultEmployees" statementType="CALLABLE" resultMap="employeeResultMap">
{call sp_get_adult_employees(
#{total, mode=OUT, jdbcType=INTEGER}
)}
</select>
然后再Mapper中使用就可以了
public interface EmployeeMapper extends BaseMapper<Employee> {
EmployeeResult getAdultEmployees();
}
总结
本篇主要讲了全局系统变量和会话系统变量的区别,以及全局系统变量和会话系统变量的查询修改,还补充了Mybatis-Plus使用存储过程的方法。