首批通过分布式安全可靠测评,为关键业务系统打造
强读全局索引表路由
更新时间:2026-04-14 17:41:09
使用强读全局索引表路由时,ODP 会将 SQL 语句中提供的索引值作为分区键来计算路由。强读分区表时,在为分区表创建全局索引,并在后续的读写中使用索引值作为查询条件的情况下,可使用 ODP 的全局索引路由功能来提升查询效率。
您可通过配置 ODP 配置项开启强读全局索引表路由,涉及的配置项及修改方法如下。
ALTER PROXYCONFIG SET server_routing_mode = 'oceanbase';
ALTER PROXYCONFIG SET proxy_primary_zone_name ='';
ALTER PROXYCONFIG SET enable_reroute = true;
ALTER PROXYCONFIG SET enable_index_route = true;
示例
执行如下命令创建主表和全局索引表
创建主表
obclient [test]> CREATE TABLE T0(C1 INT, C2 INT) PARTITION BY KEY(C1) PARTITIONS 8;创建全局索引表
obclient [test]> CREATE INDEX T0_INDEX ON T0(C2) GLOBAL PARTITION BY RANGE(C2) (PARTITION P0 VALUES LESS THAN (100), PARTITION P1 VALUES LESS THAN (200), PARTITION P2 VALUES LESS THAN (300));
在待执行的 SQL 语句中提供索引列值,示例如下
obclient [test]> SELECT * FROM T0 WHERE C2=150;第一次使用索引查询将会进行随机路由,OceanBase 数据库将返回索引表的 Leader,ODP 会构建 SQL 语句到索引表名称的映射:
SELECT * FROM T0 WHERE C2=150;->T0_INDEX。再次查询该语句将直接获取 T0_INDEX 表的映射,进行计算路由。通过诊断日志查看路由选取过程
注意
不可使用 EXPLAIN ROUTE 命令查看路由选取过程,因为 EXPLAIN ROUTE 命令中的 SQL 不会真正转发给 OBServer 节点,所以无法查询到
SELECT * FROM T0 WHERE C2=150;到T0_INDEX的映射。[2023-08-21 16:01:01.340924] [56910][Y0-00007FDF4FB404E0] [ROUTE]((*route_diagnosis= Trans Current Query:"SELECT * FROM T0 WHERE c2=150" Route Prompts > ROUTE_INFO [INFO] Will use global index table name as real table name to route Route Plan > SQL_PARSE:{cmd:"COM_QUERY", table:"__idx_500006_T0_index"} > ROUTE_INFO:{route_info_type:"USE_INDEX"} > LOCATION_CACHE_LOOKUP:{mode:"oceanbase"} > TABLE_ENTRY_LOOKUP_DONE:{table:"__idx_500006_T0_index", table_id:500018, partition_num:3, table_type:"USER INDEX", entry_from_remote:false} > PARTITION_ID_CALC_START:{} > EXPR_PARSE:{col_val:"c2=150"} > RESOLVE_EXPR:{part_range:"[150 ; 150]"} > RESOLVE_TOKEN:{token_type:"TOKEN_INT_VAL", resolve:{"BIGINT":150}, token:"150"} > CALC_PARTITION_ID:{part_description:"partition by range (P500015[{"BIGINT":100}], P500016[{"BIGINT":200}], P500017[{"BIGINT":300}])"} > PARTITION_ID_CALC_DONE:{partition_id:1152921504606846978, level:1, partitions:"(p1)"} > PARTITION_ENTRY_LOOKUP_DONE:{leader:"10.10.10.1:50109", entry_from_remote:false} > ROUTE_POLICY:{chosen_route_type:"ROUTE_TYPE_LEADER"} > CONGESTION_CONTROL:{svr_addr:"10.10.10.1:50109"} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"} )