MySQL的系统变量存在两个作用域:全局作用域(Global)和会话作用域(Session):

  • MySQL启动时,初始化所有系统变量全局作用域的值(除非一个系统变量只有会话作用域):
    • 默认值
    • 配置文件中的值
  • 新建立一个会话时,根据当前所有系统变量全局作用域的值,初始化相应系统变量会话作用域的值

注意:

  • 在当前会话中修改Global.Var的值,当前会话的Session.Var不受影响,但新建立会话后,Session.Var会受影响

    实现

    在MySQL中,对系统变量进行了分类实现:

  • Sys_var_bit:位类型,如unique_ckecks / autocommit

  • Sys_var_double:浮点类型,如long_query_time
  • Sys_var_enum:枚举类型,如binlog_format
  • ……

这里只说明对Sys_var_bit的SET的实现,以unique_checks为例:
【会话作用域】

  • 每个线程维护一个自身的“变量比特位”(option_bits),每一个比特位表示一个变量的取值
  • 每个系统变量(Sys_var_bit类型)定义自身的掩码,例如OPTION_RELAXED_UNIQUE_CHECKS=1<<27(unique_checks)
  • 查看线程THD的unique_checks:
    • THD.option_bits & OPTION_RELAXED_UNIQUE_CHECKS(取变量比特位的第27位,就是这个线程unique_checks的取值)
  • 修改线程THD的unique_checks:
    • THD.option_bits |= OPTION_RELAXED_UNIQUE_CHECKS(设置变量比特位的第27位,就是设置这个线程unique_checks的值)

【全局作用域】

  • 定义全局变量global_system_variables,维护掩码(option_bits)
  • 其余同【会话作用域】

下面是MySQL在实现的几个细节:

  • 每个线程THD中,system_variables保存系统变量
  • system_variables中option_bits保存这个THD中的所有Sys_var_bit类型变量的取值
  • 如何获取system_variables中的option_bits?(简单的system_variables.option_bits就可以了,但MySQL不是这么实现的)