mysql数据库系统自定义的参数和系统的运行参数都非常重要,他们决定了数据库运行的方式。例如是否自动提交,事务隔离级别这些变量。我们可以通过修改系统的会话变量和全局变量来影响数据库运行(其中有些变量修改需要修改重启才能生效)。。。。。。变量设置是过程,我们最终目的是要看状态(见下图),查看数据库状态信息是否符合要求。
mysql变量分为会话级别和全局级别:用户变量和会话级别的系统变量属于会话级别的变量;而系统变量中的全局变量属于全局级别的变量。当然喜欢的话也可以按照用户变量和系统变量这个角度来划分变量。
而系统变量按其作用域的不同分为以下几种:
1)分为全局(GLOBAL)级:对整个MySQL服务器有效
SELECT @@GLOBAL.autocommit
SHOW GLOBAL VARIABLES LIKE 'autocommit'
2)会话(SESSION或LOCAL)级:只影响当前会话
SELECT @@SESSION.var_name 或
SELECT @@LOCAL.var_name
SHOW SESSION VARIABLES LIKE 'autocommit'
3)both,即是全局变量也是会话变量
上面既有全局变量autocommit,也有会话变量的autocommit。
但是规定如果没有在前面声明SESSION还是GLOBAL,优先显示会话级别的值。
1会话级变量
什么是会话级别呢?比如我这里用msyql客户端工具创建了2个查询分析器,就是2个会话。可以认为一个会话就是一个线程连接。线程之间互不影响。
会话变量包含了用户变量和session变量。特点是线程之间互不影响,且当连接断开变量消失
1.1用户自定义变量
用户变量当然是会话级别的,但是也分为两种:1.存储过程中的变量,只存活在存储过程中;2.利用sql语句将值存储在用户自定义变量中。
1.11.存储过程中的变量
存储过程指的是一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少。
mysql> delimiter // #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
-> BEGIN
-> DELETE FROM MATCHES
-> WHERE playerno = p_playerno;
-> END; //
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; #将语句的结束符号恢复为分号
- 默认情况下,mysql中的delimiter(分隔符)是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。当输入“delimiter //”这是告诉mysql不要以分号作为马上执行的标记,而是用//这个符号。最后再告诉mysql用回分号作为分隔符。
1.1.2 储存sql的值
# 实例说明:
- declare @name nvarchar(10),@id int
- set @name='张三'
- set @int=1
- update set name=@name from student where id=@id
mysql> SELECT 'Hello World' into @x;
mysql> SELECT @x;
mysql> SET @y='Goodbye Cruel World';
mysql> select @y;
mysql> SET @z=1+2+3;
mysql> select @z;
1.2会话变量
这里的会话级别变量指的是系统设置会话的变量。属于系统变量。
SHOW SESSION VARIABLES
共有452个变量。可见可以影响会话的系统变量很多。
查看当前用户信息
--查看当前用户
SELECT USER()
--查看当前的数据库
SELECT DATABASE()
--查看当前用户的权限
SHOW GRANTS FOR root@127.0.0.1
1.2.1 用于连接的会话变量
--查看同一账户的所有客户端允许连接到mysql的最大并行连接数
show global status like 'max_user_connections';
如果设置为0表示不限制。但是这个值需要严格控制。
1.2.2 临时表使用内存
--查看临时表使用的内存(线程)
show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
max_heap_table_size 16777216
tmp_table_size 16777216
重点:一般这两个值都是相等的。意思是当临时表的大小超过了这个值就将会放置到硬盘中去。
--超过限制的临时表存放硬盘地址
show variables like 'tmpdir';
解释:
tmp_table_size它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了该值的限制,MySQL就会自动地把它转化为基于磁盘的