You need to enable JavaScript to run this app.
导航

使用 Hint 语法

最近更新时间2024.03.01 14:44:51

首次发布时间2022.11.25 21:46:19

本文介绍如何通过 Hint 语法使指定节点执行 SQL 请求。

背景信息

使用 Hint 语法可以强制 SQL 请求在指定的节点上执行。Hint 的路由优先级最高,不受一致性、事务的约束,但 Hint 功能依赖 Proxy 链路,需要开启读写分离,并对所有连接生效,请在使用前合理评估是否可以用于业务。

支持的 Hint 语法

  • 当前支持以下三种 Hint:
    • 指定到主节点执行。

      /* FORCE_MASTER */
      
    • 指定到只读节点执行。

      /* FORCE_SLAVE */
      
    • 指定某个具体节点执行。在目标实例的连接管理菜单下获取节点 ID。

      /* FORCE_NODE='<id>' */
      

说明

指定节点不存在 / 该节点暂时不可用时,使用 Hint 强制路由将报错 specific node[<id>] not found

支持的 SQL 语句

支持以下类型的单 SQL 语句:

  • SHOW STATEMENT
  • SELECT STATEMENT
  • EXPLAIN STATEMENT
  • UNION STATEMENT
  • KILL STATEMENT

说明

  • 支持大小写混用(如 /* FORCE_master */ show databases;)。
  • 支持在 SDK 中使用。

转发策略

在读写分离指定各节点权重前提下使用 Hint,将会按照以下策略进行转发:

  • 指定到主节点执行(/* FORCE_MASTER */
    可在主节点权重为 0 的情况下,将 SQL 语句强制路由至主节点。

  • 指定到只读节点执行(/* FORCE_SLAVE */
    首先尝试在只读节点间按权重做转发,若只读节点权重均为 0,语句将被路由至主节点。

  • 指定某个具体节点执行(/* FORCE_NODE='<id>' */
    可在特定节点权重为 0 的情况下,将语句强制路由至该节点。

使用限制

  • 在 MySQL 客户端中通过命令行进行连接并使用 Hint 语句时,需在命令中增加 -c 选项,否则 Hint 会被 MySQL 命令行工具过滤

  • Hint 注释限制在 SQL 语句起始部分,如 /* FORCE_MASTER */ show databases;;语句内注释不解析,如 show /* FORCE_MASTER */ databases;

  • 不支持在一条 SQL 语句中加入多条 Hint,如 /* FORCE_MASTER FORCE_SLAVE */

  • 暂不支持通过 Hint 转发 PREPARE 语句或多语句,如 show databases; use test;