MySQL - 数据库中的系统变量和用户变量详解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL - 数据库中的系统变量和用户变量详解

MySQL中变量分为两种:系统变量和用户变量。

【1】系统变量

系统定义好的变量,大部分时候用户根本不需要使用系统变量。系统变量是用来控制服务器表现的。如:autocommit,auto_increment_increment等。

① 查看系统变量

--查看所有变量
show variables;
--查看范围变量
show variables like '%变量名%';

示例:

--查看mysql数据目录
show VARIABLES like 'datadir'

20170628104004150.png


② 查看变量值

任何一个有数据返回的内容都是由select查看。

  • 查看系统变量值
select @@变量名;

20170628104747554.png

  • 同时查看多个变量值;


③ 修改系统变量

修改系统变量有两种方式:会话级别和全局级别。

  • 会话级别

临时修改,当前客户端当次连接有效,关闭将会恢复默认值。

有说法称为会话变量,属于系统变量子集,区别与用户变量!

set 变量名 = 变量值;
or
set @@变量名 = 变量值;

示例如下:

set autocommit = 0;
set @@ autocommit = 0;

查看会话变量如下:


  • 全局级别

一次修改,永久生效(对所有客户端都生效)。

set global 变量名 = 值;

示例如下:

set GLOBAL autocommit = 1;

当前客户端修改后需要关闭连接重新打开,即可看到生效。

如果对方(其他)客户端当前已经连接上服务器,那么当次修改无效,要退出重新登录才会生效。


④ 变量单位

不同的变量的单位不同,比如table_cache是指缓存的表的个数,而key_buffer_size则是以字节为单位,另外还有以页或者百分比为单位的变量。

许多变量可以通过后缀制订单位,比如1M表示一百万字节,在配置文件中或者在命令行下有效。但是在使用set命令的时候,这些单位就无效,必须使用数字,单位为字节。

比如:

set @@session.sort_buffer_size = 1024*1024
或者
set @@session.sort_buffer_size = 1048576

但是配置文件中设置的时候就不能使用表达式。


【2】自定义变量

  • 用户在使用过程中自定义的变量,即用户变量。
  • 系统为了区分系统变量,规定用户自定义变量必须使用一个@符号。
  • 所有自定义变量都是会话级别。

语法格式如下 :

set @变量名;

默认值为null,可以赋值:

set @name = 'Jane';


  • 查看自定义变量值
select @变量名;
如:
--select @name;

这里需要说明的是,在MySQL中,"="很多时候会被当做比较符号处理。为了区分比较和赋值的概念,MySQL指定了特殊的赋值符号:“:=”

示例如下:

--赋值
set @name := 'Janu';
--查看
select @name;

除了上面直接赋值方式,MySQL还允许从数据表中获取数据,赋值给变量,有两种方式。


① 边赋值,边查看结果

select @变量名 := 字段名 from table where...;

示例如下 :

SELECT @name1 := name from p_user;

结果集有多个值,相当于多次赋值,后者覆盖前者。

查看变量值:

SELECT @name1;

20170628143053305.png

② 先赋值,后查看

-- 赋值如下
select 字段名(或统计函数) into @变量名 from  table where[条件字句1..] ;
or
select 字段名(或统计函数) from  table where[条件字句1..] into @变量名;
-- 查看如下
select @变量名;

需要注意的是,这里结果集最多只能有一个数据,才能成功为变量赋值。

错误示例图如下:

正确示例如下:

SELECT name into @name1 from p_user where id =1   ;
SELECT name  from p_user where id =2  into @name2 ;
SELECT @name1,@name2;

20170628144320189.png

或者如下:

SELECT name,age  into @name1 ,@age1 from p_user where id =1   ;
select @name1,@age1;

20170628144617672.png


综上,给用户变量赋值有两中方式:

① 方式一

set @变量 = 变量值[表达式];
or
set @变量 := 变量值[表达式];

② 经过查询或计算赋予值

select [column][function] into @变量名 from table_name where [..][..];
or
select [column][function]  from table_name where [..][..] into @变量名;

示例如下:

set @name1 [:]= (select name from p_user where id = 2);
select @name1;

20170628193004853.png


用户变量多种赋值方式:

CREATE TRIGGER `tr_puser` AFTER INSERT ON `p_user` FOR EACH ROW BEGIN
DECLARE p_v int(11) DEFAULT 0;
DECLARE p_v1 int(11) DEFAULT 0;
  select sum(age) into p_v from p_user ;--第一种
  select sum(age)  from p_user into p_v1;--第二种
  set @user_count = p_v;--第三种
  set @user_count1 := p_v1;--第四种
  set @user_count2 :=(select sum(age) from p_user);--第五种
  select new.age into @user_count3;
--其中第五种是一个变形。
end;

【3】常见变量的设置与获取资源说明

① key_buffer_size

为键缓冲区(key buffer,也叫键缓存key cache)分配所指定的空间,操作系统不会为该设置立马分配内存,而是等到使用的时候才分配。

② table_cache_size

当有线程打开表时,MySQL会检查这个标量的值。如果大于缓存中表的数量,线程可以把最先打开的表放入缓存。如果该值比缓存中的表数小,MySQL将从缓存中删除不常用的表。

③ thread_cache_size

当有连接关闭时,MySQL检查缓存中是否还有空间来缓存线程。如果有则缓存该线程已被下次连接重用。如果没有他将销毁该线程而不再缓存。

缓存中使用的线程数,不会立即减少,只有在新的连接删除缓存中的一个线程并使用后才会减少。

MySQL只在关闭连接时候才在缓冲中增减线程,在创建新的连接的时候才从缓存中删除线程。


④ query_cache_size

MySQL启动的时候,一次性分配并且初始化这块内存。如果修改这个变量(即使设置为与当前值一样)MySQL会立刻删除所有缓存的查询,重新分配这片缓存到指定大小,并且重新初始化内存。

⑤ read_buffer_size

MySQL只会在查询需要时才会为该缓存分配内存,并且会一次性分配改参数指定大小的全部内存。


⑥ read_rnd_buffer_size


MySQL只会在查询需要时才会为该缓存分配内存,并且只分配需要的内存大小而不是全部指定的大小,应该叫做,max_read_rnd_buffer_size。⑦ sort_buffer_size


MySQL只会在查询需要做排序操作的时候拆毁为该缓存分配内存,一旦需要排序,MySQL就会立刻分配给该参数指定大小的全部内存,而不管排序是否需要这么大的内存。


由此可见,不同的变量,设置之后的启用时间,启用原理,生效方式等都是有一定差异的。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
12天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
53 13
MySQL的安装&数据库的简单操作
|
6天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
7天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
2天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
10 2
|
7天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
22 4
|
16天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
29 2
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
177 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
132 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
|
存储 SQL 关系型数据库
MySQL---数据库从入门走向大神系列(五)-存储过程
MySQL---数据库从入门走向大神系列(五)-存储过程
134 0
MySQL---数据库从入门走向大神系列(五)-存储过程

热门文章

最新文章