产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议




begin_ts;在自身缓存中查询 SQL 语句对应的 RG 路由信息;若无,则将对应的 key 范围查询请求发送给 TDMC,由 TDMC 告知最新的路由信息。commit_ts,提交事务;若过程中,参与事务的其他 RG 发生切主, 则从 TDMC 查询其最新的 Leader 信息。


节点类型 | 节点规格 | 节点个数 |
HyperNode | 16Core CPU/32GB Memory/增强型 SSD 云硬盘300GB | 3 |
-- 订单表 orders,一级hash分区表:CREATETABLE orders (order_id INTNOTNULLAUTO_INCREMENT,customer_id INTNOTNULL,order_date DATENOTNULL,total_amount DECIMAL(10,2)NOTNULL,PRIMARYKEY(order_id))PARTITIONBYHASH(order_id)PARTITIONS 3;-- 订单明细表 order_items,每个订单随机1-3个商品,一级hash分区表:CREATETABLE order_items (item_id INTNOTNULLAUTO_INCREMENT,order_id INTNOTNULL,product_id INTNOTNULL,quantity INTNOTNULL,price DECIMAL(10,2)NOTNULL,PRIMARYKEY(item_id, order_id),INDEX idx_order_id (order_id))PARTITIONBYHASH(order_id)PARTITIONS 3;--造数过程略,两表最终记录数:MySQL [klose]>selectcount(*)from orders;+----------+|count(*)|+----------+|1000000|+----------+1rowinset(0.10 sec)MySQL [klose]>selectcount(*)from order_items;+----------+|count(*)|+----------+|1999742|+----------+1rowinset(0.39 sec)--查看数据分布,确保同号分区在相同对等节点的同一个 RG 中:SELECTb.rep_group_id, a.data_obj_name, a.schema_name, a.data_obj_name, c.leader_node_name,SUM(b.region_stats_approximate_size)AS size,SUM(b.region_stats_approximate_keys)AS key_numFROMINFORMATION_SCHEMA.META_CLUSTER_DATA_OBJECTS a,INFORMATION_SCHEMA.META_CLUSTER_REGIONS b,INFORMATION_SCHEMA.META_CLUSTER_RGS cWHEREa.data_obj_id = b.data_obj_idand b.rep_group_id = c.rep_group_idand a.data_obj_type notlike'%index%'and a.data_obj_type notlike'%AUTOINC%'and a.schema_name ='klose'and data_obj_name notlike'%bak%'GROUPBYb.rep_group_id, a.schema_name, a.data_obj_nameORDERBY1,2,3;+--------------+----------------+-------------+----------------+--------------------------+---------+---------+| rep_group_id | data_obj_name | schema_name | data_obj_name | leader_node_name | size | key_num |+--------------+----------------+-------------+----------------+--------------------------+---------+---------+|868437| orders.p1 | klose | orders.p1 | node-tdsql3-c1528b96-002|3909181|333334||868437| order_items.p1 | klose | order_items.p1 | node-tdsql3-c1528b96-002|7708701|666508||869169| orders.p0 | klose | orders.p0 | node-tdsql3-c1528b96-001|3792790|333333||869169| order_items.p0 | klose | order_items.p0 | node-tdsql3-c1528b96-001|7575671|666757||869736| orders.p2 | klose | orders.p2 | node-tdsql3-c1528b96-003|3782701|333333||869736| order_items.p2 | klose | order_items.p2 | node-tdsql3-c1528b96-003|7550956|666477|+--------------+----------------+-------------+----------------+--------------------------+---------+---------+--使用 Jmeter 测试关联查询,观察 local scan 的性能:SELECTCOUNT(*)FROM orders a JOIN order_items b ON a.order_id=b.order_id;--执行计划,每个节点启一个 worker 线程,完成本节点的并行子任务:以 orders 表在当前节点的任一子分区(p0-p2)作为驱动表,其每一行记录到 order_items 表中利用索引快速找到满足条件的匹配行,最终汇聚所有 worker 线程的结果并返回;如果都是 local scan,执行效率将大幅提升:|-> Aggregate: count(0)(cost=763055.75rows=2000000)-> Gather (slice: 1, workers: 3)(cost=563055.75rows=2000000)-> Aggregate: count(0)(cost=763055.75rows=2000000)-> Nested loopinnerjoin(cost=563055.75rows=2000000)->Index scan on a usingPRIMARY,with parallel scan ranges: 3(cost=112507.50rows=1000000)->Index lookup on b using idx_order_id (order_id=a.order_id)(cost=0.25rows=2)

--当前同号分区都在相同节点上:+--------------+----------------+-------------+----------------+--------------------------+---------+---------+| rep_group_id | data_obj_name | schema_name | data_obj_name | leader_node_name | size | key_num |+--------------+----------------+-------------+----------------+--------------------------+---------+---------+|868437| orders.p1 | klose | orders.p1 | node-tdsql3-c1528b96-002|3909181|333334||868437| order_items.p1 | klose | order_items.p1 | node-tdsql3-c1528b96-002|7708701|666508||869169| orders.p0 | klose | orders.p0 | node-tdsql3-c1528b96-001|3792790|333333||869169| order_items.p0 | klose | order_items.p0 | node-tdsql3-c1528b96-001|7575671|666757||869736| orders.p2 | klose | orders.p2 | node-tdsql3-c1528b96-003|3782701|333333||869736| order_items.p2 | klose | order_items.p2 | node-tdsql3-c1528b96-003|7550956|666477|+--------------+----------------+-------------+----------------+--------------------------+---------+---------+--模拟先前版本 TDSQL Boundless 中默认没有分区亲和性的状态,将 RG 分裂,并进行打散:ALTER INSTANCE SPLIT RG 868437BY'table';ALTER INSTANCE SPLIT RG 869169BY'table';ALTER INSTANCE SPLIT RG 869736BY'table';ALTER INSTANCE TRANSFER LEADER RG 869169TO'node-tdsql3-c1528b96-002';ALTER INSTANCE TRANSFER LEADER RG 868437TO'node-tdsql3-c1528b96-003';ALTER INSTANCE TRANSFER LEADER RG 869736TO'node-tdsql3-c1528b96-001';ALTER INSTANCE TRANSFER LEADER RG 72133681TO'node-tdsql3-c1528b96-001';--调整 TDMC 参数,避免预创建 RG leader 回切:将 TDMC 管控参数 check-primary-rep-group-enabled 设置为 0。--查看数据分布,确认同号分区当前已不再相同对等节点上:SELECTb.rep_group_id, a.data_obj_name, a.schema_name, a.data_obj_name, c.leader_node_name,SUM(b.region_stats_approximate_size)AS size,SUM(b.region_stats_approximate_keys)AS key_numFROMINFORMATION_SCHEMA.META_CLUSTER_DATA_OBJECTS a,INFORMATION_SCHEMA.META_CLUSTER_REGIONS b,INFORMATION_SCHEMA.META_CLUSTER_RGS cWHEREa.data_obj_id = b.data_obj_idand b.rep_group_id = c.rep_group_idand a.data_obj_type notlike'%index%'and a.data_obj_type notlike'%AUTOINC%'and a.schema_name ='klose'and data_obj_name notlike'%bak%'GROUPBYb.rep_group_id, a.schema_name, a.data_obj_nameORDERBY1,2,3;+--------------+----------------+-------------+----------------+--------------------------+---------+---------+| rep_group_id | data_obj_name | schema_name | data_obj_name | leader_node_name | size | key_num |+--------------+----------------+-------------+----------------+--------------------------+---------+---------+|869736| orders.p2 | klose | orders.p2 | node-tdsql3-c1528b96-001|3782701|333333||72133681| order_items.p0 | klose | order_items.p0 | node-tdsql3-c1528b96-001|7575671|666757||869169| orders.p0 | klose | orders.p0 | node-tdsql3-c1528b96-002|3792790|333333||72132949| order_items.p1 | klose | order_items.p1 | node-tdsql3-c1528b96-002|7708701|666508||868437| orders.p1 | klose | orders.p1 | node-tdsql3-c1528b96-003|3909181|333334||72134504| order_items.p2 | klose | order_items.p2 | node-tdsql3-c1528b96-003|7550956|666477|+--------------+----------------+-------------+----------------+--------------------------+---------+---------+--再次执行关联查询,由于现在同号分区全都不在一个对等节点上,orders 表中每一行记录到 order_items 表中进行索引匹配都要走 RPC 调用,叠加三可用区之间 1-3ms 左右的延迟,预期执行效率会大幅下降:SELECT COUNT(*) FROM orders a JOIN order_items b ON a.order_id=b.order_id;

文档反馈