自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