更新时间:2026-01-13 GMT+08:00
分享

Statement Outline

操作场景

MySQL数据库实例运行过程中,SQL语句的执行计划可能会频繁变化,导致数据库性能不稳定。TaurusDB 设计了一套利用 MySQL Optimizer/Index hint 来稳定执行计划的方法,称为 Statement outline,并提供了一组管理接口(dbms_outln package)以方便使用。

前提条件

TaurusDB的内核版本大于等于2.0.42.230600,支持Statement Outline功能。内核版本的查询方法请参见如何查看云数据库 TaurusDB实例的版本号

注意事项

  • Statement Outline默认关闭,如果您需要使用,请参见开启Statement Outline
  • Statement Outline不开启情况下对性能没有影响,但是特性开启后在规则较多的情况下对性能会产生影响,会导致性能下降。

功能描述

Statement Outline支持MySQL8.0的Optimizer Hints和Index Hints场景:

  • Optimizer Hints

    根据作用域(query block)和Hint对象,分为Global-Level Hint, Table-Level Hint, Index-Level Hint和Join-Order Hint等,详情请参见Optimizer Hints

  • Index Hints

    Index Hint是向优化器提供有关在查询处理期间如何选择索引,不更改优化器策略。合理的索引可以加快数据索引操作,常用的索引Hint方式有三种,USE(参考使用),IGNORE(忽略),FORCE(强制),详情请参见Index Hints

开启Statement Outline

  1. 登录TaurusDB管理控制台
  2. 在“实例管理”页面,选择目标实例,单击实例名称,进入实例概览页面。
  3. 在左侧导航栏选择“参数修改”
  4. 在搜索框中搜索参数“rds_opt_outline_enabled”,将对应的值改为“ON”

    表1 参数说明

    参数名称

    描述

    rds_opt_outline_enabled

    Statement Outline功能开关。

    • ON:表示开启Statement Outline功能。
    • OFF:表示关闭Statement Outline功能。

  5. 单击“保存”

Statement Outline表介绍

TaurusDB内置了一个系统表(outline)保存Hint,系统启动时会自动创建该表,无需您手动创建。创建表的SQL语句如下:

CREATE TABLE `mysql`.`outline` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Schema_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `Digest` varchar(64) COLLATE utf8_bin NOT NULL,
  `Digest_text` longtext COLLATE utf8_bin,
  `Type` enum('IGNORE INDEX','USE INDEX','FORCE INDEX','OPTIMIZER') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `Scope` enum('','FOR JOIN','FOR ORDER BY','FOR GROUP BY') CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '',
  `State` enum('N','Y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y',
  `Position` bigint(20) NOT NULL,
  `Hint` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB
 DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 COMMENT='Statement outline'

各字段解释如下:

表2 字段解释

参数

说明

Id

outline ID。

Schema_name

数据库名称。

Digest

Digest_text进行哈希计算得到的64字节的哈希字符串。

Digest_text

SQL语句的特征。

Type

Optimizer Hints中,Hint类型的取值为OPTIMIZER。

Index Hints中,Hint类型的取值为USE INDEX、FORCE INDEX或IGNORE INDEX。

Scope

仅Index Hints需要提供该参数,取值如下:

  • FOR GROUP BY
  • FOR ORDER BY
  • FOR JOIN
  • 空字符串
    说明:

    如果设置为空字符串,表示所有类型的Index Hints。

State

本规则是否启用,取值范围:

  • N
  • Y(默认)

Position

  • Optimizer Hints

    Position表示Query Block,因为所有的Optimizer Hints必须作用到Query Block上,Position从1开始,Hint作用在语句的第几个关键字上,Position取值即为对应的值。

  • Index Hints

    Position表示表的位置, 也是从1开始,Hint作用在第几张表上,Position取值即为对应的值。

Hint

  • Optimizer Hints中,Hint表示完整的Hint字符串,例如/*+ MAX_EXECUTION_TIME(1000) */。
  • Index Hints中,Hint表示索引名字的列表, 例如ind_1,ind_2。

管理Statement Outline

为了便捷地管理Statement Outline,定义了六个本地存储规则。

功能验证

验证Statement Outline是否有效果,有如下方法:

  • 通过preview_outline进行预览

  • 直接使用EXPLAIN查看

相关文档