数据库内核月报 - 2015 / 02

MariaDB · 特性分析· Per-query variables

自MariaDB 10.1.2起,MariaDB提供了一种"Per-query variables的方式来为Query设置语句级变量,通过 SET STATEMENT 语句可以为接下来要执行的语句设置一些系统变量值。

语法

SET STATEMENT var1=value1 [, var2=value2, …] FOR

varN是一个系统变量,valueN是一个常量值。但是有部分变量是不支持的,在这个章节的末尾列出了所有不支持的变量。

一条 "SET STATEMENT var1=value1 FOR stmt" 语句等价与如下一系列操作:

SET @save_value=@@var1;

SET SESSION var1=value1;

stmt;

SET SESSION var1=@save_value;

MySQL服务器在执行整条语句前会先做解析,所以所有影响解析器的变量都无法达到预期的效果,因为解析完之后才能获得这些变量的值。例如字符集变量sql_mode=ansi_quotes。

一些使用特性的例子

可以限制语句的执行时间 max_statement_time: SET STATEMENT max_statement_time=1000 FOR SELECT … ;

为一个语句临时改变优化器的规则: SET STATEMENT optimizer_switch='materialization=off' FOR SELECT ….;

为一个语句单独打开MRR/BKA特性: SET STATEMENT join_cache_level=6, optimizer_switch='mrr=on' FOR SELECT …

下面这些变量无法使用Per-query variables特性来设置

autocommit

character_set_client

character_set_connection

character_set_filesystem

collation_connection

default_master_connection

debug_sync

interactive_timeout

gtid_domain_id

last_insert_id

log_slow_filter

log_slow_rate_limit

log_slow_verbosity

long_query_time

min_examined_row_limit

profiling

profiling_history_size

query_cache_type

rand_seed1

rand_seed2

skip_replication

slow_query_log

sql_log_off

tx_isolation

wait_timeout