从MySQL8.0.3开始,MySQL支持一种新的优化Hint,名字叫SET_VAR,这个特性支持用户在查询语句里修改MySQL数据库的一些会话变量,当然修改只是对当前查询会话生效,不会影响到其他会话。
先来看看在此之前,我们要对一个查询进行会话变量修改,需要怎么操作:
1.查询之前的系统变量
mysql> select @@optimizer_switch;
2.备份系统变量
mysql> set @old_optimizer_switch = @@optimizer_switch;
3.设置新的变量
mysql> set optimizer_switch='index_merge=off';
4.运行查询语句
mysql> select c_id from customer limit 1;;
5.恢复之前的系统变量
mysql> set optimizer_switch = @old_optimizer_switch;
是不是有点繁琐,现在我们使用SET_VAR这个新特性,很方便的就可以做这个操作了。
mysql> select /*+ set_var(optimizer_switch='index_merge=off') set_var(join_buffer_size=4M) */ c_id from customer limit 1;
+------+
| c_id |
+------+
| 1814 |
+------+
1 row in set (0.00 sec)
这个新特性是不是很方便呢,想想之前,在体验MySQL的ICP,MRR等新查询特性带来快感的时候,由于执行计划器选择错误,导致查询语句性能低下的时候,又不能随意更改线上数据库的变量,有了SET_VAR这个新特性,对于这种情况,是不是可以考虑在查询语句中就优化掉呢。
但是这个只是对部分变量可以用的,基本都是和SQL查询相关的变量才能这样操作。目前主要支持的变量如下,大家使用的时候参考即可。
SET_VAR支持的变量列表:
auto_increment_increment
auto_increment_offset
big_tables
bulk_insert_buffer_size
default_tmp_storage_engine
div_precision_increment
end_markers_in_json
eq_range_index_dive_limit
foreign_key_checks
group_concat_max_len
insert_id
internal_tmp_mem_storage_engine
join_buffer_size
lock_wait_timeout
max_error_count
max_execution_time
max_heap_table_size
max_join_size
max_length_for_sort_data
max_points_in_geometry
max_seeks_for_key
max_sort_length
optimizer_prune_level
optimizer_search_depth variables
optimizer_switch
range_alloc_block_size
range_optimizer_max_mem_size
read_buffer_size
read_rnd_buffer_size
sort_buffer_size
sql_auto_is_null
sql_big_selects
sql_buffer_result
sql_mode
sql_safe_updates
sql_select_limit
timestamp
tmp_table_size
updatable_views_with_limit
unique_checks
windowing_use_high_precision