Mysql杂志(七)

全局系统变量与会话系统变量

全局系统变量

全局系统变量是MySQL服务器级别的配置参数,控制着整个数据库实例的运行行为。它们具有以下核心特性:服务器级作用域 ​:影响所有客户端连接、​持久性配置 ​:可通过配置文件永久保存、​初始化加载 ​:在MySQL服务启动时加载、集中管理​:由数据库管理员(DBA)统一控制。

这个就好比主包之前有讲过的Maven的父pom和子pom的关系差不多,每个新的会话都会继承全局的环境变量,这个会话大家可以理解成一个一个连接窗口。

sql 复制代码
-- 基础语法(需要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 GLOBAL max_connections=500
持久化全局变量 SET PERSIST SYSTEM_VARIABLES_ADMIN SET PERSIST max_connections=500
会话系统变量 SET SESSION 普通用户权限 SET SESSION wait_timeout=300
用户自定义变量 SET @var 仅需连接权限 SET @debug_mode=1

会话系统变量

会话系统变量(SESSION variables)是MySQL中仅对当前数据库连接生效 的配置参数,具有以下核心特性:连接隔离性​ :每个连接维护自己独立的变量副本、​继承性​ :新建连接时从全局变量继承初始值、​临时性 ​:连接关闭后所有修改自动丢弃、优先级​:会话设置会覆盖继承的全局值。

sql 复制代码
-- 标准语法
SET SESSION 变量名 = 值;

-- 示例:修改当前会话的超时时间
SET SESSION wait_timeout = 600;  -- 单位:秒

-- 等效简写(SESSION可省略)
SET wait_timeout = 600;
SET @@session.wait_timeout = 600;
SET @@wait_timeout = 600;

其实和全局系统变量的修改基本上是相同的,只是前面的关键词是不一样的。下面这个表就是对于用户自定义变量的要求,从表里我们可以看到无论是全局的还是会话的其实都是不支持用户自定义一个系统变量的,这个就有点让主包失望了,因为这样少了很多可玩性。

变量类型 前缀 是否可新增 作用范围 持久性 示例
全局系统变量 ❌ 不可新增 整个MySQL实例 重启失效(除非持久化) max_connections
会话系统变量 ❌ 不可新增 当前连接 连接结束失效 wait_timeout
用户会话变量 @ ✅ 可自定义 当前连接 连接结束失效 @my_custom_var
局部变量​ (存储过程) ✅ 可自定义 当前BEGIN-END块 过程执行结束 DECLARE x INT

查询系统变量

sql 复制代码
-- 查看所有会话变量
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 调用存储过程

今天再来补充一下上一篇的内容,因为上一篇讲存储过程的时候,主包忘记说怎么使用存储过程了,这一篇补税。

先定义一个存储过程

sql 复制代码
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 ;

然后定义实体类

java 复制代码
@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和映射

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中使用就可以了

java 复制代码
public interface EmployeeMapper extends BaseMapper<Employee> {
    EmployeeResult getAdultEmployees();
}

总结

本篇主要讲了全局系统变量和会话系统变量的区别,以及全局系统变量和会话系统变量的查询修改,还补充了Mybatis-Plus使用存储过程的方法。

相关推荐
白鲸开源20 小时前
SeaTunnel 如何给 MySQL 表做“精准切片”?一篇读懂 CDC 分片黑科技
大数据·mysql·开源
2301_8035545220 小时前
Redis分层缓存
数据库·redis·缓存
麦兜*21 小时前
MongoDB 事务管理:多文档操作如何保证 ACID?
java·数据库·后端·mongodb·spring cloud·springboot
努力的小郑21 小时前
MySQL 基础架构(一):SQL语句的执行之旅
后端·mysql·架构
柑木21 小时前
数据库-MySQL-MySQL的权限管理机制(USER/ROLE/GRANT/REVOKE)
数据库·后端·数据分析
灵犀物润21 小时前
Rancher 管理集群与命令行管理集群的具体操作步骤,并且分别展示如何安装 MySQL
数据库·mysql·rancher
武子康21 小时前
Java-114 深入浅出 MySQL 开源分布式中间件 ShardingSphere 深度解读
java·数据库·分布式·mysql·中间件·性能优化·开源
hunzi_121 小时前
搭建发帖商城系统的核心注意事项:从规划到运营的全维度指南
大数据·数据库
zhz521421 小时前
基于SQLite索引的智能图片压缩存储系统设计与实现
数据库·sqlite·图片压缩·压缩