Mycat数据库中间件( 二 )


DB2: [5,6,7,8,9,16,17]
DB3: [20,21,22,23,24,25,26]
经过最小堆计算后得到最小序列 [0,1,2,3,4,5,6] ,然后返回偏移量为5的两个结果为 [5,6]  。
虽然Mycat返回了正确的结果,但是仔细推敲发现这类操作的处理逻辑是及其消耗(浪费)资源的 。应用需要的结果集为2条,Mycat中需要处理的结果数为21条 。也就是说,对于有 t 个DB节点的全分片 limit m, n 操作,Mycat需要处理的数据量为 (m+n)*t 个 。比如实际应用中有50个DB节点,要执行limit 1000,10操作,则Mycat处理的数据量为 50500 条,返回结果集为 10 ,当偏移量更大时,内存和CPU资源的消耗则是数十倍增加 。
如果设计使用Mycat时有分页排序,请考虑放弃!
3.任意表JOIN先看一下在单库中JOIN中的场景 。假设在某单库中有 player 和 team 两张表, player 表中的 team_id 字段与 team 表中的 id 字段相关联 。操作场景如下图:

Mycat数据库中间件

文章插图
 
JOIN操作的SQL如下
mysql>select p_name,t_name from player p, team t where p.no = 3 and p.team_id = t.id;
此时能查询出结果
p_name
t_name
Wade
Heat
如果将这两个表的数据分库后,相关联的数据可能分布在不同的DB节点上,如下图:
Mycat数据库中间件

文章插图
 
这个SQL在各个单独的分片DB中都查不出结果,也就是说Mycat不能查询出正确的结果集 。
设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请考虑放弃!
4.分布式事务Mycat并没有根据二阶段提交协议实现 XA事务 ,而是只保证 prepare 阶段数据一致性的 弱XA事务 ,实现过程如下:
应用开启事务后Mycat标识该连接为非自动提交,比如前端执行
mysql>begin;
Mycat不会立即把命令发送到DB节点上,等后续下发SQL时,Mycat从连接池获取非自动提交的连接去执行 。
Mycat数据库中间件

文章插图
 
Mycat会等待各个节点的返回结果,如果都执行成功,Mycat给该连接标识为 Prepare Ready 状态,如果有一个节点执行失败,则标识为 Rollback 状态 。
Mycat数据库中间件

文章插图
 
执行完成后Mycat等待前端发送 


推荐阅读