自MariaDB 10.1.2起,MariaDB提供了一种"Per-query variables的方式来为Query设置语句级变量,通过 SET STATEMENT 语句可以为接下来要执行的语句设置一些系统变量值。
语法
SET STATEMENT var1=value1 [, var2=value2, ...] FOR <statement>
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