HINT语法使用说明

本文介绍如何在读写模式为可读可写(自动读写分离)的集群地址中使用HINT语法。

使用限制

仅读写模式为可读可写(自动读写分离)的集群地址支持HINT语法,只读模式下的集群地址和主地址均不支持HINT语法。关于集群地址的读写模式信息,请参见集群地址的读写模式

注意事项

HINT的路由优化级别最高,不受一致性级别和事务拆分的约束,使用前请进行评估。

使用方法

  • 支持在SQL语句前加上/*FORCE_MASTER*//*FORCE_SLAVE*/强制指定这条SQL的路由方向。

    例如select * from test默认会路由到只读节点,改为/*FORCE_MASTER*/ select * from test就会路由到主节点。需要注意的是,/*FORCE_MASTER*/只能在可读可写的地址上生效,对于只读地址即使使用//*FORCE_MASTER*/也不会路由到主节点。

  • 支持在SQL语句前加上/*force_node='<节点ID>'*/强制指定在某节点执行某查询命令。

    例如/*force_node='pi-bpxxxxxxxx'*/ show processlist,该show processlist命令只在pi-bpxxxxxxxx节点执行。如果该节点发生故障,则返回报错force HINT server node is not found, please check.

  • 支持在SQL语句前加上/*force_proxy_internal*/set force_node = '<节点ID>'强制指定在某节点执行所有查询命令。

    例如/*force_proxy_internal*/set force_node = 'pi-bpxxxxxxxx',执行该命令后,后续所有查询命令只发往pi-bpxxxxxxxx节点,如果该节点发生故障,则返回报错set force node 'rr-bpxxxxx' is not found, please check.

  • 支持在SQL语句前加上 /*force_all*/ 强制将语句广播到所有的节点,返回结果分两种场景:

    说明

    该场景适用的PolarDB数据库代理(PolarProxy)版本需为2.8.36版本及以上,如何查看和升级当前数据库代理版本,请参见版本管理

    • 对于一些系统库表(information_schema.processlistinformation_schema.innodb_trxperformance_schema.threadsperformance_schema.metadata_lockssys.schema_table_lock_waits)的访问会返回所有节点的合并结果。

      例如/*force_all*/select * from information_schema.processlist,广播到所有的节点并返回所有节点合并后的结果。另外,如果该语句前没有/*force_all*/ hint,即select * from information_schema.processlist,将随机路由。

    • 其它库表或场景的访问只返回主库的结果。

  • 当开启列存和行存自动引流功能时,支持通过增加HINT语法/*FORCE_IMIC_NODES*/将请求强制路由到列存节点上执行。行列自动引流详情请参见配置行列自动分流

    说明
    • 上述HINT语法不区分大小写,但在使用时必须将HINT语法放在SQL语句的句首。

    • 若您需要通过MySQL官方命令行执行上述HINT语句,请在命令行中加上-c参数,否则该HINT会被MySQL官方命令行过滤导致HINT失效,具体请参见MySQL官方命令行

    • 通常不建议使用/*force_proxy_internal*/语法,会导致后续所有查询请求都发往该节点,读写分离失效。

    • HINT语句里不要有改变环境变量的语句,例如/*FORCE_SLAVE*/ set names utf8; 等,这类语句可能导致后续的业务出错。