博客
MySQL8.0优化Hint-查询语句中设置会话变量
- 2018年5月22日
- 作者: 茹憶
- 分类目录 MySQL
阅读1,376次
没有评论
从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
版权声明:本文为DBARUN原创文章,如需转载请注明本站作者及本文链接,DBARUN保留一切法律解释权。
本文链接:http://www.dbarun.com/mysql/mysql8-0-hint-set-var-for-query/
作者: 茹憶

PHP开发工程师(WEB开发认证)、曾就职于1号店高级MySQL DBA、现就职于中国平安,专注于MySQL架构设计和优化、Python技术研究、数据库自动化平台构建。开源天兔数据库监控系统(www.lepus.cc)开发作者。